[
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"extends\": \"eslint:recommended\",\n  \"parserOptions\": {\n    \"sourceType\": \"module\",\n    \"ecmaVersion\": 8\n  },\n  \"env\": {\n    \"es6\": true\n  },\n  \"rules\": {\n    \"no-cond-assign\": 0\n  }\n}\n"
  },
  {
    "path": ".github/eslint.json",
    "content": "{\n  \"problemMatcher\": [\n    {\n      \"owner\": \"eslint-compact\",\n      \"pattern\": [\n        {\n          \"regexp\": \"^(.+):\\\\sline\\\\s(\\\\d+),\\\\scol\\\\s(\\\\d+),\\\\s(Error|Warning|Info)\\\\s-\\\\s(.+)\\\\s\\\\((.+)\\\\)$\",\n          \"file\": 1,\n          \"line\": 2,\n          \"column\": 3,\n          \"severity\": 4,\n          \"message\": 5,\n          \"code\": 6\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": ".github/workflows/node.js.yml",
    "content": "# https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: Node.js CI\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [14.x]\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: yarn --frozen-lockfile\n    - run: |\n        echo ::add-matcher::.github/eslint.json\n        yarn run eslint src test --format=compact\n    - run: yarn test\n"
  },
  {
    "path": ".gitignore",
    "content": "*.sublime-workspace\n.DS_Store\ndist/\nnode_modules\nnpm-debug.log\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2010-2021 Mike Bostock\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# d3-time-format\n\n<a href=\"https://d3js.org\"><img src=\"https://github.com/d3/d3/raw/main/docs/public/logo.svg\" width=\"256\" height=\"256\"></a>\n\nThis module can be used to parse or format [dates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) in a variety of locale-specific representations.\n\n## Resources\n\n- [Documentation](https://d3js.org/d3-time-format)\n- [Releases](https://github.com/d3/d3-time-format/releases)\n- [Getting help](https://d3js.org/community)\n"
  },
  {
    "path": "locale/ar-EG.json",
    "content": "{\n  \"dateTime\": \"%x, %X\",\n  \"date\": \"%-d/%-m/%Y\",\n  \"time\": \"%-I:%M:%S %p\",\n  \"periods\": [\"ص\", \"م\"],\n  \"days\": [\"الأحد\", \"الإثنين\", \"الثلاثاء\", \"الأربعاء\", \"الخميس\", \"الجمعة\", \"السبت\"],\n  \"shortDays\": [\"أحد\", \"إثنين\", \"ثلاثاء\", \"أربعاء\", \"خميس\", \"جمعة\", \"سبت\"],\n  \"months\": [\"يناير\", \"فبراير\", \"مارس\", \"أبريل\", \"مايو\", \"يونيو\", \"يوليو\", \"أغسطس\", \"سبتمبر\", \"أكتوبر\", \"نوفمبر\", \"ديسمبر\"],\n  \"shortMonths\": [\"يناير\", \"فبراير\", \"مارس\", \"أبريل\", \"مايو\", \"يونيو\", \"يوليو\", \"أغسطس\", \"سبتمبر\", \"أكتوبر\", \"نوفمبر\", \"ديسمبر\"]\n}\n"
  },
  {
    "path": "locale/ar-SY.json",
    "content": "{\n  \"dateTime\": \"%x, %X\",\n  \"date\": \"%-d/%-m/%Y\",\n  \"time\": \"%-I:%M:%S %p\",\n  \"periods\": [\"ص\", \"م\"],\n  \"days\": [\"الأحد\", \"الإثنين\", \"الثلاثاء\", \"الأربعاء\", \"الخميس\", \"الجمعة\", \"السبت\"],\n  \"shortDays\": [\"أحد\", \"إثنين\", \"ثلاثاء\", \"أربعاء\", \"خميس\", \"جمعة\", \"سبت\"],\n  \"months\": [\"كانون الثاني\", \"شباط\", \"آذار\", \"نيسان\", \"أيار\", \"حزيران\", \"تموز\", \"آب\", \"أيلول\", \"تشرين الأول\", \"تشرين الثاني\", \"كانون الأول\"],\n  \"shortMonths\": [\"ك٢\", \"شباط\", \"آذار\", \"نيسان\", \"أيار\", \"حزيران\", \"تموز\", \"آب\", \"أيلول\", \"ت١\", \"ت٢\", \"ك١\"]\n}\n"
  },
  {
    "path": "locale/ca-ES.json",
    "content": "{\n  \"dateTime\": \"%A, %e de %B de %Y, %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"diumenge\", \"dilluns\", \"dimarts\", \"dimecres\", \"dijous\", \"divendres\", \"dissabte\"],\n  \"shortDays\": [\"dg.\", \"dl.\", \"dt.\", \"dc.\", \"dj.\", \"dv.\", \"ds.\"],\n  \"months\": [\"gener\", \"febrer\", \"març\", \"abril\", \"maig\", \"juny\", \"juliol\", \"agost\", \"setembre\", \"octubre\", \"novembre\", \"desembre\"],\n  \"shortMonths\": [\"gen.\", \"febr.\", \"març\", \"abr.\", \"maig\", \"juny\", \"jul.\", \"ag.\", \"set.\", \"oct.\", \"nov.\", \"des.\"]\n}\n"
  },
  {
    "path": "locale/cs-CZ.json",
    "content": "{\n  \"dateTime\": \"%A,%e.%B %Y, %X\",\n  \"date\": \"%-d.%-m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"neděle\", \"pondělí\", \"úterý\", \"středa\", \"čvrtek\", \"pátek\", \"sobota\"],\n  \"shortDays\": [\"ne.\", \"po.\", \"út.\", \"st.\", \"čt.\", \"pá.\", \"so.\"],\n  \"months\": [\"leden\", \"únor\", \"březen\", \"duben\", \"květen\", \"červen\", \"červenec\", \"srpen\", \"září\", \"říjen\", \"listopad\", \"prosinec\"],\n  \"shortMonths\": [\"led\", \"úno\", \"břez\", \"dub\", \"kvě\", \"čer\", \"červ\", \"srp\", \"zář\", \"říj\", \"list\", \"pros\"]\n}\n"
  },
  {
    "path": "locale/da-DK.json",
    "content": "{\n  \"dateTime\": \"%A den %d %B %Y %X\",\n  \"date\": \"%d-%m-%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"søndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"lørdag\"],\n  \"shortDays\": [\"søn\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"lør\"],\n  \"months\": [\"januar\", \"februar\", \"marts\", \"april\", \"maj\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"december\"],\n  \"shortMonths\": [\"jan\", \"feb\", \"mar\", \"apr\", \"maj\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"]\n}\n"
  },
  {
    "path": "locale/de-CH.json",
    "content": "{\n  \"dateTime\": \"%A, der %e. %B %Y, %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n  \"shortDays\": [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n  \"months\": [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n  \"shortMonths\": [\"Jan\", \"Feb\", \"Mrz\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"]\n}\n"
  },
  {
    "path": "locale/de-DE.json",
    "content": "{\n  \"dateTime\": \"%A, der %e. %B %Y, %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"],\n  \"shortDays\": [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n  \"months\": [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n  \"shortMonths\": [\"Jan\", \"Feb\", \"Mrz\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"]\n}\n"
  },
  {
    "path": "locale/en-CA.json",
    "content": "{\n  \"dateTime\": \"%a %b %e %X %Y\",\n  \"date\": \"%Y-%m-%d\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n  \"shortDays\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  \"months\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n  \"shortMonths\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n}\n"
  },
  {
    "path": "locale/en-GB.json",
    "content": "{\n  \"dateTime\": \"%a %e %b %X %Y\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n  \"shortDays\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  \"months\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n  \"shortMonths\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n}\n"
  },
  {
    "path": "locale/en-US.json",
    "content": "{\n  \"dateTime\": \"%x, %X\",\n  \"date\": \"%-m/%-d/%Y\",\n  \"time\": \"%-I:%M:%S %p\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n  \"shortDays\": [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  \"months\": [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n  \"shortMonths\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n}\n"
  },
  {
    "path": "locale/es-ES.json",
    "content": "{\n  \"dateTime\": \"%A, %e de %B de %Y, %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"domingo\", \"lunes\", \"martes\", \"miércoles\", \"jueves\", \"viernes\", \"sábado\"],\n  \"shortDays\": [\"dom\", \"lun\", \"mar\", \"mié\", \"jue\", \"vie\", \"sáb\"],\n  \"months\": [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n  \"shortMonths\": [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"]\n}\n"
  },
  {
    "path": "locale/es-MX.json",
    "content": "{\n  \"dateTime\": \"%x, %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%-I:%M:%S %p\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"domingo\", \"lunes\", \"martes\", \"miércoles\", \"jueves\", \"viernes\", \"sábado\"],\n  \"shortDays\": [\"dom\", \"lun\", \"mar\", \"mié\", \"jue\", \"vie\", \"sáb\"],\n  \"months\": [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"],\n  \"shortMonths\": [\"ene\", \"feb\", \"mar\", \"abr\", \"may\", \"jun\", \"jul\", \"ago\", \"sep\", \"oct\", \"nov\", \"dic\"]\n}\n"
  },
  {
    "path": "locale/fa-IR.json",
    "content": "{\n  \"dateTime\": \"%x, %X\",\n  \"date\": \"%-d/%-m/%Y\",\n  \"time\": \"%-I:%M:%S %p\",\n  \"periods\": [\"صبح\", \"عصر\"],\n  \"days\": [\"یکشنبه\", \"دوشنبه\", \"سه شنبه\", \"چهارشنبه\", \"پنجشنبه\", \"جمعه\", \"شنبه\"],\n  \"shortDays\": [\"یکشنبه\", \"دوشنبه\", \"سه شنبه\", \"چهارشنبه\", \"پنجشنبه\", \"جمعه\", \"شنبه\"],\n  \"months\": [\"ژانویه\", \"فوریه\", \"مارس\", \"آوریل\", \"مه\", \"ژوئن\", \"ژوئیه\", \"اوت\", \"سپتامبر\", \"اکتبر\", \"نوامبر\", \"دسامبر\"],\n  \"shortMonths\": [\"ژانویه\", \"فوریه\", \"مارس\", \"آوریل\", \"مه\", \"ژوئن\", \"ژوئیه\", \"اوت\", \"سپتامبر\", \"اکتبر\", \"نوامبر\", \"دسامبر\"]\n}\n"
  },
  {
    "path": "locale/fi-FI.json",
    "content": "{\n  \"dateTime\": \"%A, %-d. %Bta %Y klo %X\",\n  \"date\": \"%-d.%-m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"a.m.\", \"p.m.\"],\n  \"days\": [\"sunnuntai\", \"maanantai\", \"tiistai\", \"keskiviikko\", \"torstai\", \"perjantai\", \"lauantai\"],\n  \"shortDays\": [\"Su\", \"Ma\", \"Ti\", \"Ke\", \"To\", \"Pe\", \"La\"],\n  \"months\": [\"tammikuu\", \"helmikuu\", \"maaliskuu\", \"huhtikuu\", \"toukokuu\", \"kesäkuu\", \"heinäkuu\", \"elokuu\", \"syyskuu\", \"lokakuu\", \"marraskuu\", \"joulukuu\"],\n  \"shortMonths\": [\"Tammi\", \"Helmi\", \"Maalis\", \"Huhti\", \"Touko\", \"Kesä\", \"Heinä\", \"Elo\", \"Syys\", \"Loka\", \"Marras\", \"Joulu\"]\n}\n"
  },
  {
    "path": "locale/fr-CA.json",
    "content": "{\n  \"dateTime\": \"%a %e %b %Y %X\",\n  \"date\": \"%Y-%m-%d\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"\", \"\"],\n  \"days\": [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n  \"shortDays\": [\"dim\", \"lun\", \"mar\", \"mer\", \"jeu\", \"ven\", \"sam\"],\n  \"months\": [\"janvier\", \"février\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"août\", \"septembre\", \"octobre\", \"novembre\", \"décembre\"],\n  \"shortMonths\": [\"jan\", \"fév\", \"mar\", \"avr\", \"mai\", \"jui\", \"jul\", \"aoû\", \"sep\", \"oct\", \"nov\", \"déc\"]\n}\n"
  },
  {
    "path": "locale/fr-FR.json",
    "content": "{\n  \"dateTime\": \"%A %e %B %Y à %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"dimanche\", \"lundi\", \"mardi\", \"mercredi\", \"jeudi\", \"vendredi\", \"samedi\"],\n  \"shortDays\": [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n  \"months\": [\"janvier\", \"février\", \"mars\", \"avril\", \"mai\", \"juin\", \"juillet\", \"août\", \"septembre\", \"octobre\", \"novembre\", \"décembre\"],\n  \"shortMonths\": [\"janv.\", \"févr.\", \"mars\", \"avr.\", \"mai\", \"juin\", \"juil.\", \"août\", \"sept.\", \"oct.\", \"nov.\", \"déc.\"]\n}\n"
  },
  {
    "path": "locale/he-IL.json",
    "content": "{\n  \"dateTime\": \"%A, %e ב%B %Y %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"ראשון\", \"שני\", \"שלישי\", \"רביעי\", \"חמישי\", \"שישי\", \"שבת\"],\n  \"shortDays\": [\"א׳\", \"ב׳\", \"ג׳\", \"ד׳\", \"ה׳\", \"ו׳\", \"ש׳\"],\n  \"months\": [\"ינואר\", \"פברואר\", \"מרץ\", \"אפריל\", \"מאי\", \"יוני\", \"יולי\", \"אוגוסט\", \"ספטמבר\", \"אוקטובר\", \"נובמבר\", \"דצמבר\"],\n  \"shortMonths\": [\"ינו׳\", \"פבר׳\", \"מרץ\", \"אפר׳\", \"מאי\", \"יוני\", \"יולי\", \"אוג׳\", \"ספט׳\", \"אוק׳\", \"נוב׳\", \"דצמ׳\"]\n}\n"
  },
  {
    "path": "locale/hr-HR.json",
    "content": "{\n  \"dateTime\": \"%A, %e. %B %Y., %X\",\n  \"date\": \"%d. %m. %Y.\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Nedjelja\", \"Ponedjeljak\", \"Utorak\", \"Srijeda\", \"Četvtrak\", \"Petak\", \"Subota\"],\n  \"shortDays\": [\"Ne\", \"Po\", \"Ut\", \"Sr\", \"Če\", \"Pe\", \"Su\"],\n  \"months\": [\"Siječanj\", \"Veljača\", \"Ožujak\", \"Travanj\", \"Svibanj\", \"Lipanj\", \"Srpanj\", \"Kolovoz\", \"Rujan\", \"Listopad\", \"Studeni\", \"Prosinac\"],\n  \"shortMonths\": [\"Sij\", \"Velj\", \"Ožu\", \"Tra\", \"Svi\", \"Lip\", \"Srp\", \"Kol\", \"Ruj\", \"Lis\", \"Stu\", \"Pro\"]\n}\n"
  },
  {
    "path": "locale/hu-HU.json",
    "content": "{\n  \"dateTime\": \"%Y. %B %-e., %A %X\",\n  \"date\": \"%Y. %m. %d.\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"de.\", \"du.\"],\n  \"days\": [\"vasárnap\", \"hétfő\", \"kedd\", \"szerda\", \"csütörtök\", \"péntek\", \"szombat\"],\n  \"shortDays\": [\"V\", \"H\", \"K\", \"Sze\", \"Cs\", \"P\", \"Szo\"],\n  \"months\": [\"január\", \"február\", \"március\", \"április\", \"május\", \"június\", \"július\", \"augusztus\", \"szeptember\", \"október\", \"november\", \"december\"],\n  \"shortMonths\": [\"jan.\", \"feb.\", \"már.\", \"ápr.\", \"máj.\", \"jún.\", \"júl.\", \"aug.\", \"szept.\", \"okt.\", \"nov.\", \"dec.\"]\n}\n"
  },
  {
    "path": "locale/it-IT.json",
    "content": "{\n  \"dateTime\": \"%A %e %B %Y, %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Domenica\", \"Lunedì\", \"Martedì\", \"Mercoledì\", \"Giovedì\", \"Venerdì\", \"Sabato\"],\n  \"shortDays\": [\"Dom\", \"Lun\", \"Mar\", \"Mer\", \"Gio\", \"Ven\", \"Sab\"],\n  \"months\": [\"Gennaio\", \"Febbraio\", \"Marzo\", \"Aprile\", \"Maggio\", \"Giugno\", \"Luglio\", \"Agosto\", \"Settembre\", \"Ottobre\", \"Novembre\", \"Dicembre\"],\n  \"shortMonths\": [\"Gen\", \"Feb\", \"Mar\", \"Apr\", \"Mag\", \"Giu\", \"Lug\", \"Ago\", \"Set\", \"Ott\", \"Nov\", \"Dic\"]\n}\n"
  },
  {
    "path": "locale/ja-JP.json",
    "content": "{\n  \"dateTime\": \"%x %a %X\",\n  \"date\": \"%Y/%m/%d\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"日曜日\", \"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\"],\n  \"shortDays\": [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"],\n  \"months\": [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"],\n  \"shortMonths\": [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"]\n}\n"
  },
  {
    "path": "locale/ko-KR.json",
    "content": "{\n  \"dateTime\": \"%Y/%m/%d %a %X\",\n  \"date\": \"%Y/%m/%d\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"오전\", \"오후\"],\n  \"days\": [\"일요일\", \"월요일\", \"화요일\", \"수요일\", \"목요일\", \"금요일\", \"토요일\"],\n  \"shortDays\": [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n  \"months\": [\"1월\", \"2월\", \"3월\", \"4월\", \"5월\", \"6월\", \"7월\", \"8월\", \"9월\", \"10월\", \"11월\", \"12월\"],\n  \"shortMonths\": [\"1월\", \"2월\", \"3월\", \"4월\", \"5월\", \"6월\", \"7월\", \"8월\", \"9월\", \"10월\", \"11월\", \"12월\"]\n}\n"
  },
  {
    "path": "locale/mk-MK.json",
    "content": "{\n  \"dateTime\": \"%A, %e %B %Y г. %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"недела\", \"понеделник\", \"вторник\", \"среда\", \"четврток\", \"петок\", \"сабота\"],\n  \"shortDays\": [\"нед\", \"пон\", \"вто\", \"сре\", \"чет\", \"пет\", \"саб\"],\n  \"months\": [\"јануари\", \"февруари\", \"март\", \"април\", \"мај\", \"јуни\", \"јули\", \"август\", \"септември\", \"октомври\", \"ноември\", \"декември\"],\n  \"shortMonths\": [\"јан\", \"фев\", \"мар\", \"апр\", \"мај\", \"јун\", \"јул\", \"авг\", \"сеп\", \"окт\", \"ное\", \"дек\"]\n}\n"
  },
  {
    "path": "locale/nb-NO.json",
    "content": "{\n  \"dateTime\": \"%A den %d. %B %Y %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"søndag\", \"mandag\", \"tirsdag\", \"onsdag\", \"torsdag\", \"fredag\", \"lørdag\"],\n  \"shortDays\": [\"søn\", \"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"lør\"],\n  \"months\": [\"januar\", \"februar\", \"mars\", \"april\", \"mai\", \"juni\", \"juli\", \"august\", \"september\", \"oktober\", \"november\", \"desember\"],\n  \"shortMonths\": [\"jan\", \"feb\", \"mars\", \"apr\", \"mai\", \"juni\", \"juli\", \"aug\", \"sep\", \"okt\", \"nov\", \"des\"]\n}\n"
  },
  {
    "path": "locale/nl-BE.json",
    "content": "{\n  \"dateTime\": \"%a %e %B %Y %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n  \"shortDays\": [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n  \"months\": [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n  \"shortMonths\": [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"]\n}\n"
  },
  {
    "path": "locale/nl-NL.json",
    "content": "{\n  \"dateTime\": \"%a %e %B %Y %X\",\n  \"date\": \"%d-%m-%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"zondag\", \"maandag\", \"dinsdag\", \"woensdag\", \"donderdag\", \"vrijdag\", \"zaterdag\"],\n  \"shortDays\": [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n  \"months\": [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"],\n  \"shortMonths\": [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"]\n}\n"
  },
  {
    "path": "locale/pl-PL.json",
    "content": "{\n  \"dateTime\": \"%A, %e %B %Y, %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Niedziela\", \"Poniedziałek\", \"Wtorek\", \"Środa\", \"Czwartek\", \"Piątek\", \"Sobota\"],\n  \"shortDays\": [\"Niedz.\", \"Pon.\", \"Wt.\", \"Śr.\", \"Czw.\", \"Pt.\", \"Sob.\"],\n  \"months\": [\"Styczeń\", \"Luty\", \"Marzec\", \"Kwiecień\", \"Maj\", \"Czerwiec\", \"Lipiec\", \"Sierpień\", \"Wrzesień\", \"Październik\", \"Listopad\", \"Grudzień\"],\n  \"shortMonths\": [\"Stycz.\", \"Luty\", \"Marz.\", \"Kwie.\", \"Maj\", \"Czerw.\", \"Lipc.\", \"Sierp.\", \"Wrz.\", \"Paźdz.\", \"Listop.\", \"Grudz.\"]\n}\n"
  },
  {
    "path": "locale/pt-BR.json",
    "content": "{\n  \"dateTime\": \"%A, %e de %B de %Y. %X\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Domingo\", \"Segunda\", \"Terça\", \"Quarta\", \"Quinta\", \"Sexta\", \"Sábado\"],\n  \"shortDays\": [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"Sáb\"],\n  \"months\": [\"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n  \"shortMonths\": [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"]\n}\n"
  },
  {
    "path": "locale/ru-RU.json",
    "content": "{\n  \"dateTime\": \"%A, %e %B %Y г. %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"воскресенье\", \"понедельник\", \"вторник\", \"среда\", \"четверг\", \"пятница\", \"суббота\"],\n  \"shortDays\": [\"вс\", \"пн\", \"вт\", \"ср\", \"чт\", \"пт\", \"сб\"],\n  \"months\": [\"января\", \"февраля\", \"марта\", \"апреля\", \"мая\", \"июня\", \"июля\", \"августа\", \"сентября\", \"октября\", \"ноября\", \"декабря\"],\n  \"shortMonths\": [\"янв\", \"фев\", \"мар\", \"апр\", \"май\", \"июн\", \"июл\", \"авг\", \"сен\", \"окт\", \"ноя\", \"дек\"]\n}\n"
  },
  {
    "path": "locale/sv-SE.json",
    "content": "{\n  \"dateTime\": \"%A den %d %B %Y %X\",\n  \"date\": \"%Y-%m-%d\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"fm\", \"em\"],\n  \"days\": [\"Söndag\", \"Måndag\", \"Tisdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lördag\"],\n  \"shortDays\": [\"Sön\", \"Mån\", \"Tis\", \"Ons\", \"Tor\", \"Fre\", \"Lör\"],\n  \"months\": [\"Januari\", \"Februari\", \"Mars\", \"April\", \"Maj\", \"Juni\", \"Juli\", \"Augusti\", \"September\", \"Oktober\", \"November\", \"December\"],\n  \"shortMonths\": [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"]\n}\n"
  },
  {
    "path": "locale/tr-TR.json",
    "content": "{\n  \"dateTime\": \"%a %e %b %X %Y\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Pazar\", \"Pazartesi\", \"Salı\", \"Çarşamba\", \"Perşembe\", \"Cuma\", \"Cumartesi\"],\n  \"shortDays\": [\"Paz\", \"Pzt\", \"Sal\", \"Çar\", \"Per\", \"Cum\", \"Cmt\"],\n  \"months\": [\"Ocak\", \"Şubat\", \"Mart\", \"Nisan\", \"Mayıs\", \"Haziran\", \"Temmuz\", \"Ağustos\", \"Eylül\", \"Ekim\", \"Kasım\", \"Aralık\"],\n  \"shortMonths\": [\"Oca\", \"Şub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"Ağu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"]\n}\n"
  },
  {
    "path": "locale/uk-UA.json",
    "content": "{\n  \"dateTime\": \"%A, %e %B %Y р. %X\",\n  \"date\": \"%d.%m.%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"дп\", \"пп\"],\n  \"days\": [\"неділя\", \"понеділок\", \"вівторок\", \"середа\", \"четвер\", \"п'ятниця\", \"субота\"],\n  \"shortDays\": [\"нд\", \"пн\", \"вт\", \"ср\", \"чт\", \"пт\", \"сб\"],\n  \"months\": [\"січня\", \"лютого\", \"березня\", \"квітня\", \"травня\", \"червня\", \"липня\", \"серпня\", \"вересня\", \"жовтня\", \"листопада\", \"грудня\"],\n  \"shortMonths\": [\"січ.\", \"лют.\", \"бер.\", \"квіт.\", \"трав.\", \"черв.\", \"лип.\", \"серп.\", \"вер.\", \"жовт.\", \"лист.\", \"груд.\"]\n}\n"
  },
  {
    "path": "locale/vi-VN.json",
    "content": "{\n  \"dateTime\": \"%a, %e %b, %Y %H:%M\",\n  \"date\": \"%d/%m/%Y\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"AM\", \"PM\"],\n  \"days\": [\"Chủ nhật\", \"Thứ hai\", \"Thứ ba\", \"Thứ tư\", \"Thứ năm\", \"Thứ sáu\", \"Thứ bảy\"],\n  \"shortDays\": [\"CN\", \"Thứ 2\", \"Thứ 3\", \"Thứ 4\", \"Thứ 5\", \"Thứ 6\", \"Thứ 7\"],\n  \"months\": [\"Tháng một\", \"Tháng hai\", \"Tháng ba\", \"Tháng tư\", \"Tháng năm\", \"Tháng sáu\", \"Tháng bảy\", \"Tháng tám\", \"Tháng chín\", \"Tháng mười\", \"Tháng mười một\", \"Tháng mười hai\"],\n  \"shortMonths\": [\"Tháng 1\", \"Tháng 2\", \"Tháng 3\", \"Tháng 4\", \"Tháng 5\", \"Tháng 6\", \"Tháng 7\", \"Tháng 8\", \"Tháng 9\", \"Tháng 10\", \"Tháng 11\", \"Tháng 12\"]\n}\n"
  },
  {
    "path": "locale/zh-CN.json",
    "content": "{\n  \"dateTime\": \"%x %A %X\",\n  \"date\": \"%Y年%-m月%-d日\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"上午\", \"下午\"],\n  \"days\": [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\n  \"shortDays\": [\"周日\", \"周一\", \"周二\", \"周三\", \"周四\", \"周五\", \"周六\"],\n  \"months\": [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n  \"shortMonths\": [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"]\n}\n"
  },
  {
    "path": "locale/zh-TW.json",
    "content": "{\n  \"dateTime\": \"%x %A %X\",\n  \"date\": \"%Y年%-m月%-d日\",\n  \"time\": \"%H:%M:%S\",\n  \"periods\": [\"上午\", \"下午\"],\n  \"days\": [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\n  \"shortDays\": [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"],\n  \"months\": [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n  \"shortMonths\": [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"]\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"d3-time-format\",\n  \"version\": \"4.1.0\",\n  \"description\": \"A JavaScript time formatter and parser inspired by strftime and strptime.\",\n  \"homepage\": \"https://d3js.org/d3-time-format/\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/d3/d3-time-format.git\"\n  },\n  \"keywords\": [\n    \"d3\",\n    \"d3-module\",\n    \"time\",\n    \"format\",\n    \"strftime\",\n    \"strptime\"\n  ],\n  \"license\": \"ISC\",\n  \"author\": {\n    \"name\": \"Mike Bostock\",\n    \"url\": \"http://bost.ocks.org/mike\"\n  },\n  \"type\": \"module\",\n  \"files\": [\n    \"dist/**/*.js\",\n    \"src/**/*.js\",\n    \"locale/*.json\"\n  ],\n  \"module\": \"src/index.js\",\n  \"main\": \"src/index.js\",\n  \"jsdelivr\": \"dist/d3-time-format.min.js\",\n  \"unpkg\": \"dist/d3-time-format.min.js\",\n  \"exports\": {\n    \".\": {\n      \"umd\": \"./dist/d3-time-format.min.js\",\n      \"default\": \"./src/index.js\"\n    },\n    \"./locale/*\": \"./locale/*.json\"\n  },\n  \"sideEffects\": [\n    \"./src/defaultLocale.js\"\n  ],\n  \"dependencies\": {\n    \"d3-time\": \"1 - 3\"\n  },\n  \"devDependencies\": {\n    \"eslint\": \"8\",\n    \"mocha\": \"9\",\n    \"rollup\": \"2\",\n    \"rollup-plugin-terser\": \"7\"\n  },\n  \"scripts\": {\n    \"test\": \"TZ=America/Los_Angeles mocha 'test/**/*-test.js' && eslint src test\",\n    \"prepublishOnly\": \"rm -rf dist && yarn test && rollup -c\",\n    \"postpublish\": \"git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \\\"${npm_package_name} ${npm_package_version}\\\" && git push && cd -\"\n  },\n  \"engines\": {\n    \"node\": \">=12\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import {readFileSync} from \"fs\";\nimport {terser} from \"rollup-plugin-terser\";\nimport * as meta from \"./package.json\";\n\n// Extract copyrights from the LICENSE.\nconst copyright = readFileSync(\"./LICENSE\", \"utf-8\")\n  .split(/\\n/g)\n  .filter(line => /^Copyright\\s+/.test(line))\n  .map(line => line.replace(/^Copyright\\s+/, \"\"))\n  .join(\", \");\n\nconst config = {\n  input: \"src/index.js\",\n  external: Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)),\n  output: {\n    file: `dist/${meta.name}.js`,\n    name: \"d3\",\n    format: \"umd\",\n    indent: false,\n    extend: true,\n    banner: `// ${meta.homepage} v${meta.version} Copyright ${copyright}`,\n    globals: Object.assign({}, ...Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)).map(key => ({[key]: \"d3\"})))\n  },\n  plugins: []\n};\n\nexport default [\n  config,\n  {\n    ...config,\n    output: {\n      ...config.output,\n      file: `dist/${meta.name}.min.js`\n    },\n    plugins: [\n      ...config.plugins,\n      terser({\n        output: {\n          preamble: config.output.banner\n        }\n      })\n    ]\n  }\n];\n"
  },
  {
    "path": "src/defaultLocale.js",
    "content": "import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n  dateTime: \"%x, %X\",\n  date: \"%-m/%-d/%Y\",\n  time: \"%-I:%M:%S %p\",\n  periods: [\"AM\", \"PM\"],\n  days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n  shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n  shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n  locale = formatLocale(definition);\n  timeFormat = locale.format;\n  timeParse = locale.parse;\n  utcFormat = locale.utcFormat;\n  utcParse = locale.utcParse;\n  return locale;\n}\n"
  },
  {
    "path": "src/index.js",
    "content": "export {default as timeFormatDefaultLocale, timeFormat, timeParse, utcFormat, utcParse} from \"./defaultLocale.js\";\nexport {default as timeFormatLocale} from \"./locale.js\";\nexport {default as isoFormat} from \"./isoFormat.js\";\nexport {default as isoParse} from \"./isoParse.js\";\n"
  },
  {
    "path": "src/isoFormat.js",
    "content": "import {utcFormat} from \"./defaultLocale.js\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n  return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n    ? formatIsoNative\n    : utcFormat(isoSpecifier);\n\nexport default formatIso;\n"
  },
  {
    "path": "src/isoParse.js",
    "content": "import {isoSpecifier} from \"./isoFormat.js\";\nimport {utcParse} from \"./defaultLocale.js\";\n\nfunction parseIsoNative(string) {\n  var date = new Date(string);\n  return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n    ? parseIsoNative\n    : utcParse(isoSpecifier);\n\nexport default parseIso;\n"
  },
  {
    "path": "src/locale.js",
    "content": "import {\n  timeDay,\n  timeSunday,\n  timeMonday,\n  timeThursday,\n  timeYear,\n  utcDay,\n  utcSunday,\n  utcMonday,\n  utcThursday,\n  utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n    date.setFullYear(d.y);\n    return date;\n  }\n  return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n    date.setUTCFullYear(d.y);\n    return date;\n  }\n  return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n  return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n  var locale_dateTime = locale.dateTime,\n      locale_date = locale.date,\n      locale_time = locale.time,\n      locale_periods = locale.periods,\n      locale_weekdays = locale.days,\n      locale_shortWeekdays = locale.shortDays,\n      locale_months = locale.months,\n      locale_shortMonths = locale.shortMonths;\n\n  var periodRe = formatRe(locale_periods),\n      periodLookup = formatLookup(locale_periods),\n      weekdayRe = formatRe(locale_weekdays),\n      weekdayLookup = formatLookup(locale_weekdays),\n      shortWeekdayRe = formatRe(locale_shortWeekdays),\n      shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n      monthRe = formatRe(locale_months),\n      monthLookup = formatLookup(locale_months),\n      shortMonthRe = formatRe(locale_shortMonths),\n      shortMonthLookup = formatLookup(locale_shortMonths);\n\n  var formats = {\n    \"a\": formatShortWeekday,\n    \"A\": formatWeekday,\n    \"b\": formatShortMonth,\n    \"B\": formatMonth,\n    \"c\": null,\n    \"d\": formatDayOfMonth,\n    \"e\": formatDayOfMonth,\n    \"f\": formatMicroseconds,\n    \"g\": formatYearISO,\n    \"G\": formatFullYearISO,\n    \"H\": formatHour24,\n    \"I\": formatHour12,\n    \"j\": formatDayOfYear,\n    \"L\": formatMilliseconds,\n    \"m\": formatMonthNumber,\n    \"M\": formatMinutes,\n    \"p\": formatPeriod,\n    \"q\": formatQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatSeconds,\n    \"u\": formatWeekdayNumberMonday,\n    \"U\": formatWeekNumberSunday,\n    \"V\": formatWeekNumberISO,\n    \"w\": formatWeekdayNumberSunday,\n    \"W\": formatWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatYear,\n    \"Y\": formatFullYear,\n    \"Z\": formatZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var utcFormats = {\n    \"a\": formatUTCShortWeekday,\n    \"A\": formatUTCWeekday,\n    \"b\": formatUTCShortMonth,\n    \"B\": formatUTCMonth,\n    \"c\": null,\n    \"d\": formatUTCDayOfMonth,\n    \"e\": formatUTCDayOfMonth,\n    \"f\": formatUTCMicroseconds,\n    \"g\": formatUTCYearISO,\n    \"G\": formatUTCFullYearISO,\n    \"H\": formatUTCHour24,\n    \"I\": formatUTCHour12,\n    \"j\": formatUTCDayOfYear,\n    \"L\": formatUTCMilliseconds,\n    \"m\": formatUTCMonthNumber,\n    \"M\": formatUTCMinutes,\n    \"p\": formatUTCPeriod,\n    \"q\": formatUTCQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatUTCSeconds,\n    \"u\": formatUTCWeekdayNumberMonday,\n    \"U\": formatUTCWeekNumberSunday,\n    \"V\": formatUTCWeekNumberISO,\n    \"w\": formatUTCWeekdayNumberSunday,\n    \"W\": formatUTCWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatUTCYear,\n    \"Y\": formatUTCFullYear,\n    \"Z\": formatUTCZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var parses = {\n    \"a\": parseShortWeekday,\n    \"A\": parseWeekday,\n    \"b\": parseShortMonth,\n    \"B\": parseMonth,\n    \"c\": parseLocaleDateTime,\n    \"d\": parseDayOfMonth,\n    \"e\": parseDayOfMonth,\n    \"f\": parseMicroseconds,\n    \"g\": parseYear,\n    \"G\": parseFullYear,\n    \"H\": parseHour24,\n    \"I\": parseHour24,\n    \"j\": parseDayOfYear,\n    \"L\": parseMilliseconds,\n    \"m\": parseMonthNumber,\n    \"M\": parseMinutes,\n    \"p\": parsePeriod,\n    \"q\": parseQuarter,\n    \"Q\": parseUnixTimestamp,\n    \"s\": parseUnixTimestampSeconds,\n    \"S\": parseSeconds,\n    \"u\": parseWeekdayNumberMonday,\n    \"U\": parseWeekNumberSunday,\n    \"V\": parseWeekNumberISO,\n    \"w\": parseWeekdayNumberSunday,\n    \"W\": parseWeekNumberMonday,\n    \"x\": parseLocaleDate,\n    \"X\": parseLocaleTime,\n    \"y\": parseYear,\n    \"Y\": parseFullYear,\n    \"Z\": parseZone,\n    \"%\": parseLiteralPercent\n  };\n\n  // These recursive directive definitions must be deferred.\n  formats.x = newFormat(locale_date, formats);\n  formats.X = newFormat(locale_time, formats);\n  formats.c = newFormat(locale_dateTime, formats);\n  utcFormats.x = newFormat(locale_date, utcFormats);\n  utcFormats.X = newFormat(locale_time, utcFormats);\n  utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n  function newFormat(specifier, formats) {\n    return function(date) {\n      var string = [],\n          i = -1,\n          j = 0,\n          n = specifier.length,\n          c,\n          pad,\n          format;\n\n      if (!(date instanceof Date)) date = new Date(+date);\n\n      while (++i < n) {\n        if (specifier.charCodeAt(i) === 37) {\n          string.push(specifier.slice(j, i));\n          if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n          else pad = c === \"e\" ? \" \" : \"0\";\n          if (format = formats[c]) c = format(date, pad);\n          string.push(c);\n          j = i + 1;\n        }\n      }\n\n      string.push(specifier.slice(j, i));\n      return string.join(\"\");\n    };\n  }\n\n  function newParse(specifier, Z) {\n    return function(string) {\n      var d = newDate(1900, undefined, 1),\n          i = parseSpecifier(d, specifier, string += \"\", 0),\n          week, day;\n      if (i != string.length) return null;\n\n      // If a UNIX timestamp is specified, return it.\n      if (\"Q\" in d) return new Date(d.Q);\n      if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n      // If this is utcParse, never use the local timezone.\n      if (Z && !(\"Z\" in d)) d.Z = 0;\n\n      // The am-pm flag is 0 for AM, and 1 for PM.\n      if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n      // If the month was not specified, inherit from the quarter.\n      if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n      // Convert day-of-week and week-of-year to day-of-year.\n      if (\"V\" in d) {\n        if (d.V < 1 || d.V > 53) return null;\n        if (!(\"w\" in d)) d.w = 1;\n        if (\"Z\" in d) {\n          week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n          week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n          week = utcDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getUTCFullYear();\n          d.m = week.getUTCMonth();\n          d.d = week.getUTCDate() + (d.w + 6) % 7;\n        } else {\n          week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n          week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n          week = timeDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getFullYear();\n          d.m = week.getMonth();\n          d.d = week.getDate() + (d.w + 6) % 7;\n        }\n      } else if (\"W\" in d || \"U\" in d) {\n        if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n        day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n        d.m = 0;\n        d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n      }\n\n      // If a time zone is specified, all fields are interpreted as UTC and then\n      // offset according to the specified time zone.\n      if (\"Z\" in d) {\n        d.H += d.Z / 100 | 0;\n        d.M += d.Z % 100;\n        return utcDate(d);\n      }\n\n      // Otherwise, all fields are in local time.\n      return localDate(d);\n    };\n  }\n\n  function parseSpecifier(d, specifier, string, j) {\n    var i = 0,\n        n = specifier.length,\n        m = string.length,\n        c,\n        parse;\n\n    while (i < n) {\n      if (j >= m) return -1;\n      c = specifier.charCodeAt(i++);\n      if (c === 37) {\n        c = specifier.charAt(i++);\n        parse = parses[c in pads ? specifier.charAt(i++) : c];\n        if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n      } else if (c != string.charCodeAt(j++)) {\n        return -1;\n      }\n    }\n\n    return j;\n  }\n\n  function parsePeriod(d, string, i) {\n    var n = periodRe.exec(string.slice(i));\n    return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n\n  function parseShortWeekday(d, string, i) {\n    var n = shortWeekdayRe.exec(string.slice(i));\n    return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n\n  function parseWeekday(d, string, i) {\n    var n = weekdayRe.exec(string.slice(i));\n    return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n\n  function parseShortMonth(d, string, i) {\n    var n = shortMonthRe.exec(string.slice(i));\n    return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n\n  function parseMonth(d, string, i) {\n    var n = monthRe.exec(string.slice(i));\n    return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n\n  function parseLocaleDateTime(d, string, i) {\n    return parseSpecifier(d, locale_dateTime, string, i);\n  }\n\n  function parseLocaleDate(d, string, i) {\n    return parseSpecifier(d, locale_date, string, i);\n  }\n\n  function parseLocaleTime(d, string, i) {\n    return parseSpecifier(d, locale_time, string, i);\n  }\n\n  function formatShortWeekday(d) {\n    return locale_shortWeekdays[d.getDay()];\n  }\n\n  function formatWeekday(d) {\n    return locale_weekdays[d.getDay()];\n  }\n\n  function formatShortMonth(d) {\n    return locale_shortMonths[d.getMonth()];\n  }\n\n  function formatMonth(d) {\n    return locale_months[d.getMonth()];\n  }\n\n  function formatPeriod(d) {\n    return locale_periods[+(d.getHours() >= 12)];\n  }\n\n  function formatQuarter(d) {\n    return 1 + ~~(d.getMonth() / 3);\n  }\n\n  function formatUTCShortWeekday(d) {\n    return locale_shortWeekdays[d.getUTCDay()];\n  }\n\n  function formatUTCWeekday(d) {\n    return locale_weekdays[d.getUTCDay()];\n  }\n\n  function formatUTCShortMonth(d) {\n    return locale_shortMonths[d.getUTCMonth()];\n  }\n\n  function formatUTCMonth(d) {\n    return locale_months[d.getUTCMonth()];\n  }\n\n  function formatUTCPeriod(d) {\n    return locale_periods[+(d.getUTCHours() >= 12)];\n  }\n\n  function formatUTCQuarter(d) {\n    return 1 + ~~(d.getUTCMonth() / 3);\n  }\n\n  return {\n    format: function(specifier) {\n      var f = newFormat(specifier += \"\", formats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    parse: function(specifier) {\n      var p = newParse(specifier += \"\", false);\n      p.toString = function() { return specifier; };\n      return p;\n    },\n    utcFormat: function(specifier) {\n      var f = newFormat(specifier += \"\", utcFormats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    utcParse: function(specifier) {\n      var p = newParse(specifier += \"\", true);\n      p.toString = function() { return specifier; };\n      return p;\n    }\n  };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n    numberRe = /^\\s*\\d+/, // note: ignores next directive\n    percentRe = /^%/,\n    requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n  var sign = value < 0 ? \"-\" : \"\",\n      string = (sign ? -value : value) + \"\",\n      length = string.length;\n  return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n  return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n  return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n  return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 4));\n  return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n  var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n  return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 6));\n  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n  var n = percentRe.exec(string.slice(i, i + 1));\n  return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n  return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n  return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n  return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n  return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n  return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n  return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n  return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n  return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n  return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n  var day = d.getDay();\n  return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n  return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n  var day = d.getDay();\n  return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n  d = dISO(d);\n  return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n  return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n  return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n  d = dISO(d);\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n  var day = d.getDay();\n  d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n  var z = d.getTimezoneOffset();\n  return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n      + pad(z / 60 | 0, \"0\", 2)\n      + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n  return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n  return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n  return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n  return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n  return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n  return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n  return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n  return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n  return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n  var dow = d.getUTCDay();\n  return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n  return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n  var day = d.getUTCDay();\n  return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n  d = UTCdISO(d);\n  return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n  return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n  return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n  d = UTCdISO(d);\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n  var day = d.getUTCDay();\n  d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n  return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n  return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n  return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n  return Math.floor(+d / 1000);\n}\n"
  },
  {
    "path": "test/.eslintrc.json",
    "content": "{\n  \"extends\": \"eslint:recommended\",\n  \"parserOptions\": {\n    \"sourceType\": \"module\",\n    \"ecmaVersion\": 8\n  },\n  \"env\": {\n    \"es6\": true,\n    \"mocha\": true\n  }\n}\n"
  },
  {
    "path": "test/date.js",
    "content": "export function local(year, month, day, hours, minutes, seconds, milliseconds) {\n  if (year == null) year = 0;\n  if (month == null) month = 0;\n  if (day == null) day = 1;\n  if (hours == null) hours = 0;\n  if (minutes == null) minutes = 0;\n  if (seconds == null) seconds = 0;\n  if (milliseconds == null) milliseconds = 0;\n  if (0 <= year && year < 100) {\n    const date = new Date(-1, month, day, hours, minutes, seconds, milliseconds);\n    date.setFullYear(year);\n    return date;\n  }\n  return new Date(year, month, day, hours, minutes, seconds, milliseconds);\n}\n\nexport function utc(year, month, day, hours, minutes, seconds, milliseconds) {\n  if (year == null) year = 0;\n  if (month == null) month = 0;\n  if (day == null) day = 1;\n  if (hours == null) hours = 0;\n  if (minutes == null) minutes = 0;\n  if (seconds == null) seconds = 0;\n  if (milliseconds == null) milliseconds = 0;\n  if (0 <= year && year < 100) {\n    const date = new Date(Date.UTC(-1, month, day, hours, minutes, seconds, milliseconds));\n    date.setUTCFullYear(year);\n    return date;\n  }\n  return new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n}\n"
  },
  {
    "path": "test/defaultLocale-test.js",
    "content": "import assert from \"assert\";\nimport {readFileSync} from \"fs\";\nimport {timeFormat, timeFormatDefaultLocale, timeParse, utcFormat, utcParse} from \"../src/index.js\";\n\nconst enUs = JSON.parse(readFileSync(\"./locale/en-US.json\"));\nconst frFr = JSON.parse(readFileSync(\"./locale/fr-FR.json\"));\n\nit(\"timeFormat(specifier) defaults to en-US\", () => {\n  assert.strictEqual(timeFormat(\"%c\")(new Date(2000, 0, 1)), \"1/1/2000, 12:00:00 AM\");\n});\n\nit(\"timeParse(specifier) defaults to en-US\", () => {\n  assert.strictEqual(+timeParse(\"%c\")(\"1/1/2000, 12:00:00 AM\"), +new Date(2000, 0, 1));\n});\n\nit(\"utcFormat(specifier) defaults to en-US\", () => {\n  assert.strictEqual(utcFormat(\"%c\")(new Date(Date.UTC(2000, 0, 1))), \"1/1/2000, 12:00:00 AM\");\n});\n\nit(\"utcParse(specifier) defaults to en-US\", () => {\n  assert.strictEqual(+utcParse(\"%c\")(\"1/1/2000, 12:00:00 AM\"), +new Date(Date.UTC(2000, 0, 1)));\n});\n\nit(\"timeFormatDefaultLocale(definition) returns the new default locale\", () => {\n  const locale = timeFormatDefaultLocale(frFr);\n  try {\n    assert.strictEqual(locale.format(\"%c\")(new Date(2000, 0, 1)), \"samedi  1 janvier 2000 à 00:00:00\");\n} finally {\n    timeFormatDefaultLocale(enUs);\n  }\n});\n\nit(\"timeFormatDefaultLocale(definition) affects timeFormat\", () => {\n  const locale = timeFormatDefaultLocale(frFr);\n  try {\n    assert.strictEqual(timeFormat, locale.format);\n    assert.strictEqual(timeFormat(\"%c\")(new Date(2000, 0, 1)), \"samedi  1 janvier 2000 à 00:00:00\");\n} finally {\n    timeFormatDefaultLocale(enUs);\n  }\n});\n\nit(\"timeFormatDefaultLocale(definition) affects timeParse\", () => {\n  const locale = timeFormatDefaultLocale(frFr);\n  try {\n    assert.strictEqual(timeParse, locale.parse);\n    assert.strictEqual(+timeParse(\"%c\")(\"samedi  1 janvier 2000 à 00:00:00\"), +new Date(2000, 0, 1));\n} finally {\n    timeFormatDefaultLocale(enUs);\n  }\n});\n\nit(\"timeFormatDefaultLocale(definition) affects utcFormat\", () => {\n  const locale = timeFormatDefaultLocale(frFr);\n  try {\n    assert.strictEqual(utcFormat, locale.utcFormat);\n    assert.strictEqual(utcFormat(\"%c\")(new Date(Date.UTC(2000, 0, 1))), \"samedi  1 janvier 2000 à 00:00:00\");\n} finally {\n    timeFormatDefaultLocale(enUs);\n  }\n});\n\nit(\"timeFormatDefaultLocale(definition) affects utcParse\", () => {\n  const locale = timeFormatDefaultLocale(frFr);\n  try {\n    assert.strictEqual(utcParse, locale.utcParse);\n    assert.strictEqual(+utcParse(\"%c\")(\"samedi  1 janvier 2000 à 00:00:00\"), +new Date(Date.UTC(2000, 0, 1)));\n} finally {\n    timeFormatDefaultLocale(enUs);\n  }\n});\n"
  },
  {
    "path": "test/format-test.js",
    "content": "import assert from \"assert\";\nimport {timeSecond, timeMinute, timeHour, timeDay, timeMonth, timeWeek, timeYear} from \"d3-time\";\nimport {timeFormat} from \"../src/index.js\";\nimport {local} from \"./date.js\";\n\nconst formatMillisecond = timeFormat(\".%L\"),\n    formatSecond = timeFormat(\":%S\"),\n    formatMinute = timeFormat(\"%I:%M\"),\n    formatHour = timeFormat(\"%I %p\"),\n    formatDay = timeFormat(\"%a %d\"),\n    formatWeek = timeFormat(\"%b %d\"),\n    formatMonth = timeFormat(\"%B\"),\n    formatYear = timeFormat(\"%Y\");\n\nfunction multi(d) {\n  return (timeSecond(d) < d ? formatMillisecond\n      : timeMinute(d) < d ? formatSecond\n      : timeHour(d) < d ? formatMinute\n      : timeDay(d) < d ? formatHour\n      : timeMonth(d) < d ? (timeWeek(d) < d ? formatDay : formatWeek)\n      : timeYear(d) < d ? formatMonth\n      : formatYear)(d);\n}\n\nit(\"timeFormat(date) coerces the specified date to a Date\", () => {\n  const f = timeFormat(\"%c\");\n  assert.strictEqual(f(+local(1990, 0, 1)), \"1/1/1990, 12:00:00 AM\");\n  assert.strictEqual(f(+local(1990, 0, 2)), \"1/2/1990, 12:00:00 AM\");\n  assert.strictEqual(f(+local(1990, 0, 3)), \"1/3/1990, 12:00:00 AM\");\n  assert.strictEqual(f(+local(1990, 0, 4)), \"1/4/1990, 12:00:00 AM\");\n  assert.strictEqual(f(+local(1990, 0, 5)), \"1/5/1990, 12:00:00 AM\");\n  assert.strictEqual(f(+local(1990, 0, 6)), \"1/6/1990, 12:00:00 AM\");\n  assert.strictEqual(f(+local(1990, 0, 7)), \"1/7/1990, 12:00:00 AM\");\n});\n\nit(\"timeFormat(\\\"%a\\\")(date) formats abbreviated weekdays\", () => {\n  const f = timeFormat(\"%a\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"Mon\");\n  assert.strictEqual(f(local(1990, 0, 2)), \"Tue\");\n  assert.strictEqual(f(local(1990, 0, 3)), \"Wed\");\n  assert.strictEqual(f(local(1990, 0, 4)), \"Thu\");\n  assert.strictEqual(f(local(1990, 0, 5)), \"Fri\");\n  assert.strictEqual(f(local(1990, 0, 6)), \"Sat\");\n  assert.strictEqual(f(local(1990, 0, 7)), \"Sun\");\n});\n\nit(\"timeFormat(\\\"%A\\\")(date) formats weekdays\", () => {\n  const f = timeFormat(\"%A\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"Monday\");\n  assert.strictEqual(f(local(1990, 0, 2)), \"Tuesday\");\n  assert.strictEqual(f(local(1990, 0, 3)), \"Wednesday\");\n  assert.strictEqual(f(local(1990, 0, 4)), \"Thursday\");\n  assert.strictEqual(f(local(1990, 0, 5)), \"Friday\");\n  assert.strictEqual(f(local(1990, 0, 6)), \"Saturday\");\n  assert.strictEqual(f(local(1990, 0, 7)), \"Sunday\");\n});\n\nit(\"timeFormat(\\\"%b\\\")(date) formats abbreviated months\", () => {\n  const f = timeFormat(\"%b\");\n  assert.strictEqual(f(local(1990,  0, 1)), \"Jan\");\n  assert.strictEqual(f(local(1990,  1, 1)), \"Feb\");\n  assert.strictEqual(f(local(1990,  2, 1)), \"Mar\");\n  assert.strictEqual(f(local(1990,  3, 1)), \"Apr\");\n  assert.strictEqual(f(local(1990,  4, 1)), \"May\");\n  assert.strictEqual(f(local(1990,  5, 1)), \"Jun\");\n  assert.strictEqual(f(local(1990,  6, 1)), \"Jul\");\n  assert.strictEqual(f(local(1990,  7, 1)), \"Aug\");\n  assert.strictEqual(f(local(1990,  8, 1)), \"Sep\");\n  assert.strictEqual(f(local(1990,  9, 1)), \"Oct\");\n  assert.strictEqual(f(local(1990, 10, 1)), \"Nov\");\n  assert.strictEqual(f(local(1990, 11, 1)), \"Dec\");\n});\n\nit(\"timeFormat(\\\"%B\\\")(date) formats months\", () => {\n  const f = timeFormat(\"%B\");\n  assert.strictEqual(f(local(1990,  0, 1)), \"January\");\n  assert.strictEqual(f(local(1990,  1, 1)), \"February\");\n  assert.strictEqual(f(local(1990,  2, 1)), \"March\");\n  assert.strictEqual(f(local(1990,  3, 1)), \"April\");\n  assert.strictEqual(f(local(1990,  4, 1)), \"May\");\n  assert.strictEqual(f(local(1990,  5, 1)), \"June\");\n  assert.strictEqual(f(local(1990,  6, 1)), \"July\");\n  assert.strictEqual(f(local(1990,  7, 1)), \"August\");\n  assert.strictEqual(f(local(1990,  8, 1)), \"September\");\n  assert.strictEqual(f(local(1990,  9, 1)), \"October\");\n  assert.strictEqual(f(local(1990, 10, 1)), \"November\");\n  assert.strictEqual(f(local(1990, 11, 1)), \"December\");\n});\n\nit(\"timeFormat(\\\"%c\\\")(date) formats localized dates and times\", () => {\n  const f = timeFormat(\"%c\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"1/1/1990, 12:00:00 AM\");\n});\n\nit(\"timeFormat(\\\"%d\\\")(date) formats zero-padded dates\", () => {\n  const f = timeFormat(\"%d\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"01\");\n});\n\nit(\"timeFormat(\\\"%e\\\")(date) formats space-padded dates\", () => {\n  const f = timeFormat(\"%e\");\n  assert.strictEqual(f(local(1990, 0, 1)), \" 1\");\n});\n\nit(\"timeFormat(\\\"%g\\\")(date) formats zero-padded two-digit ISO 8601 years\", () => {\n  const f = timeFormat(\"%g\");\n  assert.strictEqual(f(local(2018, 11, 30, 0)), \"18\"); // Sunday\n  assert.strictEqual(f(local(2018, 11, 31, 0)), \"19\"); // Monday\n  assert.strictEqual(f(local(2019, 0, 1, 0)), \"19\");\n});\n\nit(\"timeFormat(\\\"%G\\\")(date) formats zero-padded four-digit ISO 8601 years\", () => {\n  const f = timeFormat(\"%G\");\n  assert.strictEqual(f(local(2018, 11, 30, 0)), \"2018\"); // Sunday\n  assert.strictEqual(f(local(2018, 11, 31, 0)), \"2019\"); // Monday\n  assert.strictEqual(f(local(2019, 0, 1, 0)), \"2019\");\n});\n\nit(\"timeFormat(\\\"%H\\\")(date) formats zero-padded hours (24)\", () => {\n  const f = timeFormat(\"%H\");\n  assert.strictEqual(f(local(1990, 0, 1,  0)), \"00\");\n  assert.strictEqual(f(local(1990, 0, 1, 13)), \"13\");\n});\n\nit(\"timeFormat(\\\"%I\\\")(date) formats zero-padded hours (12)\", () => {\n  const f = timeFormat(\"%I\");\n  assert.strictEqual(f(local(1990, 0, 1,  0)), \"12\");\n  assert.strictEqual(f(local(1990, 0, 1, 13)), \"01\");\n});\n\nit(\"timeFormat(\\\"%j\\\")(date) formats zero-padded day of year numbers\", () => {\n  const f = timeFormat(\"%j\");\n  assert.strictEqual(f(local(1990,  0,  1)), \"001\");\n  assert.strictEqual(f(local(1990,  5,  1)), \"152\");\n  assert.strictEqual(f(local(2010,  2, 13)), \"072\");\n  assert.strictEqual(f(local(2010,  2, 14)), \"073\"); // DST begins\n  assert.strictEqual(f(local(2010,  2, 15)), \"074\");\n  assert.strictEqual(f(local(2010, 10,  6)), \"310\");\n  assert.strictEqual(f(local(2010, 10,  7)), \"311\"); // DST ends\n  assert.strictEqual(f(local(2010, 10,  8)), \"312\");\n});\n\nit(\"timeFormat(\\\"%m\\\")(date) formats zero-padded months\", () => {\n  const f = timeFormat(\"%m\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"01\");\n  assert.strictEqual(f(local(1990, 9, 1)), \"10\");\n});\n\nit(\"timeFormat(\\\"%M\\\")(date) formats zero-padded minutes\", () => {\n  const f = timeFormat(\"%M\");\n  assert.strictEqual(f(local(1990, 0, 1, 0,  0)), \"00\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 32)), \"32\");\n});\n\nit(\"timeFormat(\\\"%p\\\")(date) formats AM or PM\", () => {\n  const f = timeFormat(\"%p\");\n  assert.strictEqual(f(local(1990, 0, 1,  0)), \"AM\");\n  assert.strictEqual(f(local(1990, 0, 1, 13)), \"PM\");\n});\n\nit(\"timeFormat(\\\"%q\\\")(date) formats quarters\", () => {\n  const f = timeFormat(\"%q\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"1\");\n  assert.strictEqual(f(local(1990, 3, 1)), \"2\");\n  assert.strictEqual(f(local(1990, 6, 1)), \"3\");\n  assert.strictEqual(f(local(1990, 9, 1)), \"4\");\n});\n\nit(\"timeFormat(\\\"%S\\\")(date) formats zero-padded seconds\", () => {\n  const f = timeFormat(\"%S\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0,  0)), \"00\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 32)), \"32\");\n  const f2 = timeFormat(\"%0S\");\n  assert.strictEqual(f2(local(1990, 0, 1, 0, 0,  0)), \"00\");\n  assert.strictEqual(f2(local(1990, 0, 1, 0, 0, 32)), \"32\");\n});\n\nit(\"timeFormat(\\\"%_S\\\")(date) formats space-padded seconds\", () => {\n  const f = timeFormat(\"%_S\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0,  0)), \" 0\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0,  3)), \" 3\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 32)), \"32\");\n});\n\nit(\"timeFormat(\\\"-S\\\")(date) formats no-padded seconds\", () => {\n  const f = timeFormat(\"%-S\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0,  0)), \"0\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0,  3)), \"3\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 32)), \"32\");\n});\n\nit(\"timeFormat(\\\"%L\\\")(date) formats zero-padded milliseconds\", () => {\n  const f = timeFormat(\"%L\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0,   0)), \"000\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0, 432)), \"432\");\n});\n\nit(\"timeFormat(\\\"%u\\\")(date) formats week day numbers\", () => {\n  const f = timeFormat(\"%u\");\n  assert.strictEqual(f(local(1990,  0,  1,  0)), \"1\");\n  assert.strictEqual(f(local(1990,  0,  7,  0)), \"7\");\n  assert.strictEqual(f(local(2010,  2, 13, 23)), \"6\");\n});\n\nit(\"timeFormat(\\\"%f\\\")(date) formats zero-padded microseconds\", () => {\n  const f = timeFormat(\"%f\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0,   0)), \"000000\");\n  assert.strictEqual(f(local(1990, 0, 1, 0, 0, 0, 432)), \"432000\");\n});\n\nit(\"timeFormat(\\\"%U\\\")(date) formats zero-padded week numbers\", () => {\n  const f = timeFormat(\"%U\");\n  assert.strictEqual(f(local(1990,  0,  1,  0)), \"00\");\n  assert.strictEqual(f(local(1990,  5,  1,  0)), \"21\");\n  assert.strictEqual(f(local(2010,  2, 13, 23)), \"10\");\n  assert.strictEqual(f(local(2010,  2, 14,  0)), \"11\"); // DST begins\n  assert.strictEqual(f(local(2010,  2, 15,  0)), \"11\");\n  assert.strictEqual(f(local(2010, 10,  6, 23)), \"44\");\n  assert.strictEqual(f(local(2010, 10,  7,  0)), \"45\"); // DST ends\n  assert.strictEqual(f(local(2010, 10,  8,  0)), \"45\");\n  assert.strictEqual(f(local(2012,  0,  1,  0)), \"01\"); // Sunday!\n});\n\nit(\"timeFormat(\\\"%W\\\")(date) formats zero-padded week numbers\", () => {\n  const f = timeFormat(\"%W\");\n  assert.strictEqual(f(local(1990,  0,  1,  0)), \"01\"); // Monday!\n  assert.strictEqual(f(local(1990,  5,  1,  0)), \"22\");\n  assert.strictEqual(f(local(2010,  2, 15,  0)), \"11\");\n  assert.strictEqual(f(local(2010, 10,  8,  0)), \"45\");\n});\n\nit(\"timeFormat(\\\"%V\\\")(date) formats zero-padded ISO 8601 week numbers\", () => {\n  const f = timeFormat(\"%V\");\n  assert.strictEqual(f(local(1990,  0,  1,  0)), \"01\");\n  assert.strictEqual(f(local(1990,  5,  1,  0)), \"22\");\n  assert.strictEqual(f(local(2010,  2, 13, 23)), \"10\");\n  assert.strictEqual(f(local(2010,  2, 14,  0)), \"10\"); // DST begins\n  assert.strictEqual(f(local(2010,  2, 15,  0)), \"11\");\n  assert.strictEqual(f(local(2010, 10,  6, 23)), \"44\");\n  assert.strictEqual(f(local(2010, 10,  7,  0)), \"44\"); // DST ends\n  assert.strictEqual(f(local(2010, 10,  8,  0)), \"45\");\n  assert.strictEqual(f(local(2015, 11,  31, 0)), \"53\");\n  assert.strictEqual(f(local(2016,  0,  1,  0)), \"53\");\n});\n\nit(\"timeFormat(\\\"%x\\\")(date) formats localized dates\", () => {\n  const f = timeFormat(\"%x\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"1/1/1990\");\n  assert.strictEqual(f(local(2010, 5, 1)), \"6/1/2010\");\n});\n\nit(\"timeFormat(\\\"%X\\\")(date) formats localized times\", () => {\n  const f = timeFormat(\"%X\");\n  assert.strictEqual(f(local(1990, 0, 1,  0,  0,  0)), \"12:00:00 AM\");\n  assert.strictEqual(f(local(1990, 0, 1, 13, 34, 59)), \"1:34:59 PM\");\n});\n\nit(\"timeFormat(\\\"%y\\\")(date) formats zero-padded two-digit years\", () => {\n  const f = timeFormat(\"%y\");\n  assert.strictEqual(f(local(+1990, 0, 1)), \"90\");\n  assert.strictEqual(f(local(+2002, 0, 1)), \"02\");\n  assert.strictEqual(f(local(-2, 0, 1)), \"-02\");\n});\n\nit(\"timeFormat(\\\"%Y\\\")(date) formats zero-padded four-digit years\", () => {\n  const f = timeFormat(\"%Y\");\n  assert.strictEqual(f(local(  123, 0, 1)), \"0123\");\n  assert.strictEqual(f(local( 1990, 0, 1)), \"1990\");\n  assert.strictEqual(f(local( 2002, 0, 1)), \"2002\");\n  assert.strictEqual(f(local(10002, 0, 1)), \"0002\");\n  assert.strictEqual(f(local(   -2, 0, 1)), \"-0002\");\n});\n\nit(\"timeFormat(\\\"%Z\\\")(date) formats time zones\", () => {\n  const f = timeFormat(\"%Z\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"-0800\");\n});\n\nit(\"timeFormat(\\\"%%\\\")(date) formats literal percent signs\", () => {\n  const f = timeFormat(\"%%\");\n  assert.strictEqual(f(local(1990, 0, 1)), \"%\");\n});\n\nit(\"timeFormat(…) can be used to create a conditional multi-format\", () => {\n  assert.strictEqual(multi(local(1990, 0, 1, 0, 0, 0, 12)), \".012\");\n  assert.strictEqual(multi(local(1990, 0, 1, 0, 0, 1,  0)), \":01\");\n  assert.strictEqual(multi(local(1990, 0, 1, 0, 1, 0,  0)), \"12:01\");\n  assert.strictEqual(multi(local(1990, 0, 1, 1, 0, 0,  0)), \"01 AM\");\n  assert.strictEqual(multi(local(1990, 0, 2, 0, 0, 0,  0)), \"Tue 02\");\n  assert.strictEqual(multi(local(1990, 1, 1, 0, 0, 0,  0)), \"February\");\n  assert.strictEqual(multi(local(1990, 0, 1, 0, 0, 0,  0)), \"1990\");\n});\n"
  },
  {
    "path": "test/isoFormat-test.js",
    "content": "import assert from \"assert\";\nimport {isoFormat} from \"../src/index.js\";\nimport {utc} from \"./date.js\";\n\nit(\"isoFormat(date) returns an ISO 8601 UTC string\", () => {\n  assert.strictEqual(isoFormat(utc(1990, 0, 1, 0, 0, 0)), \"1990-01-01T00:00:00.000Z\");\n  assert.strictEqual(isoFormat(utc(2011, 11, 31, 23, 59, 59)), \"2011-12-31T23:59:59.000Z\");\n});\n"
  },
  {
    "path": "test/isoParse-test.js",
    "content": "import assert from \"assert\";\nimport {isoParse} from \"../src/index.js\";\nimport {utc} from \"./date.js\";\n\nit(\"isoParse as ISO 8601\", () => {\n  assert.deepStrictEqual(isoParse(\"1990-01-01T00:00:00.000Z\"), utc(1990, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(isoParse(\"2011-12-31T23:59:59.000Z\"), utc(2011, 11, 31, 23, 59, 59));\n  assert.strictEqual(isoParse(\"1990-01-01T00:00:00.000X\"), null);\n});\n"
  },
  {
    "path": "test/locale-test.js",
    "content": "import assert from \"assert\";\nimport {readdirSync, readFileSync} from \"fs\";\nimport {join} from \"path\";\nimport {timeFormatLocale} from \"../src/index.js\";\n\nit(\"locale data is valid\", () => {\n  for (const localePath of readdirSync(\"locale\")) {\n    if (!/\\.json$/i.test(localePath)) continue;\n    const locale = JSON.parse(readFileSync(join(\"locale\", localePath), \"utf8\"));\n    assert.deepStrictEqual(Object.keys(locale).sort(), [\"date\", \"dateTime\", \"days\", \"months\", \"periods\", \"shortDays\", \"shortMonths\", \"time\"]);\n    timeFormatLocale(locale);\n  }\n});\n"
  },
  {
    "path": "test/parse-test.js",
    "content": "import assert from \"assert\";\nimport {readFileSync} from \"fs\";\nimport {timeFormatLocale, timeParse} from \"../src/index.js\";\nimport {local} from \"./date.js\";\n\nconst fiFi = JSON.parse(readFileSync(\"./locale/fi-FI.json\"));\n\nit(\"parse(string) coerces the specified string to a string\", () => {\n  const p = timeParse(\"%c\");\n  assert.deepStrictEqual(p({toString: function() { return \"1/1/1990, 12:00:00 AM\"; }}), local(1990, 0, 1));\n  assert.deepStrictEqual(p({toString: function() { return \"1/2/1990, 12:00:00 AM\"; }}), local(1990, 0, 2));\n  assert.deepStrictEqual(p({toString: function() { return \"1/3/1990, 12:00:00 AM\"; }}), local(1990, 0, 3));\n  assert.deepStrictEqual(p({toString: function() { return \"1/4/1990, 12:00:00 AM\"; }}), local(1990, 0, 4));\n  assert.deepStrictEqual(p({toString: function() { return \"1/5/1990, 12:00:00 AM\"; }}), local(1990, 0, 5));\n  assert.deepStrictEqual(p({toString: function() { return \"1/6/1990, 12:00:00 AM\"; }}), local(1990, 0, 6));\n  assert.deepStrictEqual(p({toString: function() { return \"1/7/1990, 12:00:00 AM\"; }}), local(1990, 0, 7));\n});\n\nit(\"timeParse(specifier) coerces the specified specifier to a string\", () => {\n  const p = timeParse({toString: function() { return \"%c\"; }});\n  assert.deepStrictEqual(p(\"1/1/1990, 12:00:00 AM\"), local(1990, 0, 1));\n});\n\nit(\"timeParse(\\\"%a %m/%d/%Y\\\")(date) parses abbreviated weekday and date\", () => {\n  const p = timeParse(\"%a %m/%d/%Y\");\n  assert.deepStrictEqual(p(\"Sun 01/01/1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Wed 02/03/1991\"), local(1991, 1, 3));\n  assert.strictEqual(p(\"XXX 03/10/2010\"), null);\n});\n\nit(\"timeParse(\\\"%A %m/%d/%Y\\\")(date) parses weekday and date\", () => {\n  const p = timeParse(\"%A %m/%d/%Y\");\n  assert.deepStrictEqual(p(\"Sunday 01/01/1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Wednesday 02/03/1991\"), local(1991, 1, 3));\n  assert.strictEqual(p(\"Caturday 03/10/2010\"), null);\n});\n\nit(\"timeParse(\\\"%U %Y\\\")(date) parses week number (Sunday) and year\", () => {\n  const p = timeParse(\"%U %Y\");\n  assert.deepStrictEqual(p(\"00 1990\"), local(1989, 11, 31));\n  assert.deepStrictEqual(p(\"05 1991\"), local(1991,  1,  3));\n  assert.deepStrictEqual(p(\"01 1995\"), local(1995,  0,  1));\n});\n\nit(\"timeParse(\\\"%a %U %Y\\\")(date) parses abbreviated weekday, week number (Sunday) and year\", () => {\n  const p = timeParse(\"%a %U %Y\");\n  assert.deepStrictEqual(p(\"Mon 00 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Sun 05 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"Sun 01 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"XXX 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%A %U %Y\\\")(date) parses weekday, week number (Sunday) and year\", () => {\n  const p = timeParse(\"%A %U %Y\");\n  assert.deepStrictEqual(p(\"Monday 00 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Sunday 05 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"Sunday 01 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"Caturday 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%w %U %Y\\\")(date) parses numeric weekday (Sunday), week number (Sunday) and year\", () => {\n  const p = timeParse(\"%w %U %Y\");\n  assert.deepStrictEqual(p(\"1 00 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"0 05 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"0 01 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"X 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%w %V %G\\\")(date) parses numeric weekday, week number (ISO) and corresponding year\", () => {\n  const p = timeParse(\"%w %V %G\");\n  assert.deepStrictEqual(p(\"1 01 1990\"), local(1990,  0,  1));\n  assert.deepStrictEqual(p(\"0 05 1991\"), local(1991,  1,  3));\n  assert.deepStrictEqual(p(\"4 53 1992\"), local(1992, 11, 31));\n  assert.deepStrictEqual(p(\"0 52 1994\"), local(1995,  0,  1));\n  assert.deepStrictEqual(p(\"0 01 1995\"), local(1995,  0,  8));\n  assert.deepStrictEqual(p(\"1 01 2018\"), local(2018,  0,  1));\n  assert.deepStrictEqual(p(\"1 01 2019\"), local(2018,  11,  31));\n});\n\nit(\"timeParse(\\\"%w %V %g\\\")(date) parses numeric weekday, week number (ISO) and corresponding two-digits year\", () => {\n  const p = timeParse(\"%w %V %g\");\n  assert.deepStrictEqual(p(\"1 01 90\"), local(1990,  0,  1));\n  assert.deepStrictEqual(p(\"0 05 91\"), local(1991,  1,  3));\n  assert.deepStrictEqual(p(\"4 53 92\"), local(1992, 11, 31));\n  assert.deepStrictEqual(p(\"0 52 94\"), local(1995,  0,  1));\n  assert.deepStrictEqual(p(\"0 01 95\"), local(1995,  0,  8));\n  assert.deepStrictEqual(p(\"1 01 18\"), local(2018,  0,  1));\n  assert.deepStrictEqual(p(\"1 01 19\"), local(2018, 11, 31));\n});\n\nit(\"timeParse(\\\"%V %g\\\")(date) parses week number (ISO) and corresponding two-digits year\", () => {\n  const p = timeParse(\"%V %g\");\n  assert.deepStrictEqual(p(\"01 90\"), local(1990,  0,  1));\n  assert.deepStrictEqual(p(\"05 91\"), local(1991,  0, 28));\n  assert.deepStrictEqual(p(\"53 92\"), local(1992, 11, 28));\n  assert.deepStrictEqual(p(\"52 94\"), local(1994, 11, 26));\n  assert.deepStrictEqual(p(\"01 95\"), local(1995,  0,  2));\n  assert.deepStrictEqual(p(\"01 18\"), local(2018,  0,  1));\n  assert.deepStrictEqual(p(\"01 19\"), local(2018, 11, 31));\n});\n\nit(\"timeParse(\\\"%u %U %Y\\\")(date) parses numeric weekday (Monday), week number (Monday) and year\", () => {\n  const p = timeParse(\"%u %W %Y\");\n  assert.deepStrictEqual(p(\"1 00 1990\"), local(1989, 11, 25));\n  assert.deepStrictEqual(p(\"1 01 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"1 05 1991\"), local(1991, 1, 4));\n  assert.deepStrictEqual(p(\"7 00 1995\"), local(1995, 0, 1));\n  assert.deepStrictEqual(p(\"1 01 1995\"), local(1995, 0, 2));\n  assert.strictEqual(p(\"X 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%W %Y\\\")(date) parses week number (Monday) and year\", () => {\n  const p = timeParse(\"%W %Y\");\n  assert.deepStrictEqual(p(\"01 1990\"), local(1990,  0,  1));\n  assert.deepStrictEqual(p(\"04 1991\"), local(1991,  0, 28));\n  assert.deepStrictEqual(p(\"00 1995\"), local(1994, 11, 26));\n});\n\nit(\"timeParse(\\\"%a %W %Y\\\")(date) parses abbreviated weekday, week number (Monday) and year\", () => {\n  const p = timeParse(\"%a %W %Y\");\n  assert.deepStrictEqual(p(\"Mon 01 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Sun 04 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"Sun 00 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"XXX 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%A %W %Y\\\")(date) parses weekday, week number (Monday) and year\", () => {\n  const p = timeParse(\"%A %W %Y\");\n  assert.deepStrictEqual(p(\"Monday 01 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Sunday 04 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"Sunday 00 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"Caturday 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%w %W %Y\\\")(date) parses numeric weekday (Sunday), week number (Monday) and year\", () => {\n  const p = timeParse(\"%w %W %Y\");\n  assert.deepStrictEqual(p(\"1 01 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"0 04 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"0 00 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"X 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%u %W %Y\\\")(date) parses numeric weekday (Monday), week number (Monday) and year\", () => {\n  const p = timeParse(\"%u %W %Y\");\n  assert.deepStrictEqual(p(\"1 01 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"7 04 1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"7 00 1995\"), local(1995, 0, 1));\n  assert.strictEqual(p(\"X 03 2010\"), null);\n});\n\nit(\"timeParse(\\\"%m/%d/%y\\\")(date) parses month, date and two-digit year\", () => {\n  const p = timeParse(\"%m/%d/%y\");\n  assert.deepStrictEqual(p(\"02/03/69\"), local(1969, 1, 3));\n  assert.deepStrictEqual(p(\"01/01/90\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"02/03/91\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"02/03/68\"), local(2068, 1, 3));\n  assert.strictEqual(p(\"03/10/2010\"), null);\n});\n\nit(\"timeParse(\\\"%x\\\")(date) parses locale date\", () => {\n  const p = timeParse(\"%x\");\n  assert.deepStrictEqual(p(\"1/1/1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"2/3/1991\"), local(1991, 1, 3));\n  assert.deepStrictEqual(p(\"3/10/2010\"), local(2010, 2, 10));\n});\n\nit(\"timeParse(\\\"%b %d, %Y\\\")(date) parses abbreviated month, date and year\", () => {\n  const p = timeParse(\"%b %d, %Y\");\n  assert.deepStrictEqual(p(\"jan 01, 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"feb  2, 2010\"), local(2010, 1, 2));\n  assert.strictEqual(p(\"jan. 1, 1990\"), null);\n});\n\nit(\"timeParse(\\\"%B %d, %Y\\\")(date) parses month, date and year\", () => {\n  const p = timeParse(\"%B %d, %Y\");\n  assert.deepStrictEqual(p(\"january 01, 1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"February  2, 2010\"), local(2010, 1, 2));\n  assert.strictEqual(p(\"jan 1, 1990\"), null);\n});\n\nit(\"timeParse(\\\"%j %m/%d/%Y\\\")(date) parses day of year and date\", () => {\n  const p = timeParse(\"%j %m/%d/%Y\");\n  assert.deepStrictEqual(p(\"001 01/01/1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"034 02/03/1991\"), local(1991, 1, 3));\n  assert.strictEqual(p(\"2012 03/10/2010\"), null);\n});\n\nit(\"timeParse(\\\"%c\\\")(date) parses locale date and time\", () => {\n  const p = timeParse(\"%c\");\n  assert.deepStrictEqual(p(\"1/1/1990, 12:00:00 AM\"), local(1990, 0, 1));\n});\n\nit(\"timeParse(\\\"%H:%M:%S\\\")(date) parses twenty-four hour, minute and second\", () => {\n  const p = timeParse(\"%H:%M:%S\");\n  assert.deepStrictEqual(p(\"00:00:00\"), local(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59\"), local(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00\"), local(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01\"), local(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"23:59:59\"), local(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"timeParse(\\\"%X\\\")(date) parses locale time\", () => {\n  const p = timeParse(\"%X\");\n  assert.deepStrictEqual(p(\"12:00:00 AM\"), local(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59 AM\"), local(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00 PM\"), local(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01 PM\"), local(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"11:59:59 PM\"), local(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"timeParse(\\\"%L\\\")(date) parses milliseconds\", () => {\n  const p = timeParse(\"%L\");\n  assert.deepStrictEqual(p(\"432\"), local(1900, 0, 1, 0, 0, 0, 432));\n});\n\nit(\"timeParse(\\\"%f\\\")(date) parses microseconds\", () => {\n  const p = timeParse(\"%f\");\n  assert.deepStrictEqual(p(\"432000\"), local(1900, 0, 1, 0, 0, 0, 432));\n});\n\nit(\"timeParse(\\\"%I:%M:%S %p\\\")(date) parses twelve hour, minute and second\", () => {\n  const p = timeParse(\"%I:%M:%S %p\");\n  assert.deepStrictEqual(p(\"12:00:00 am\"), local(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59 AM\"), local(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00 pm\"), local(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01 pm\"), local(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"11:59:59 PM\"), local(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"timeParse(\\\"%I %p\\\")(date) parses period in non-English locales\", () => {\n  const p = timeFormatLocale(fiFi).parse(\"%I:%M:%S %p\");\n  assert.deepStrictEqual(p(\"12:00:00 a.m.\"), local(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59 A.M.\"), local(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00 p.m.\"), local(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01 p.m.\"), local(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"11:59:59 P.M.\"), local(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"timeParse(\\\"%Y %q\\\")(date) parses quarters\", () => {\n  const p = timeParse(\"%Y %q\");\n  assert.deepStrictEqual(p(\"1990 1\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"1990 2\"), local(1990, 3, 1));\n  assert.deepStrictEqual(p(\"1990 3\"), local(1990, 6, 1));\n  assert.deepStrictEqual(p(\"1990 4\"), local(1990, 9, 1));\n});\n\nit(\"timeParse(\\\"%Y %q %m\\\")(date) gives the month number priority\", () => {\n  const p = timeParse(\"%Y %q %m\");\n  assert.deepStrictEqual(p(\"1990 1 2\"), local(1990, 1, 1));\n  assert.deepStrictEqual(p(\"1990 2 5\"), local(1990, 4, 1));\n  assert.deepStrictEqual(p(\"1990 3 8\"), local(1990, 7, 1));\n  assert.deepStrictEqual(p(\"1990 4 9\"), local(1990, 8, 1));\n});\n\nit(\"timeParse(\\\"%% %m/%d/%Y\\\")(date) parses literal %\", () => {\n  const p = timeParse(\"%% %m/%d/%Y\");\n  assert.deepStrictEqual(p(\"% 01/01/1990\"), local(1990, 0, 1));\n  assert.deepStrictEqual(p(\"% 02/03/1991\"), local(1991, 1, 3));\n  assert.strictEqual(p(\"%% 03/10/2010\"), null);\n});\n\nit(\"timeParse(\\\"%m/%d/%Y %Z\\\")(date) parses timezone offset\", () => {\n  const p = timeParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 +0000\"), local(1990, 0, 1, 16));\n  assert.deepStrictEqual(p(\"01/02/1990 +0100\"), local(1990, 0, 1, 15));\n  assert.deepStrictEqual(p(\"01/02/1990 +0130\"), local(1990, 0, 1, 14, 30));\n  assert.deepStrictEqual(p(\"01/02/1990 -0100\"), local(1990, 0, 1, 17));\n  assert.deepStrictEqual(p(\"01/02/1990 -0130\"), local(1990, 0, 1, 17, 30));\n  assert.deepStrictEqual(p(\"01/02/1990 -0800\"), local(1990, 0, 2, 0));\n});\n\nit(\"timeParse(\\\"%m/%d/%Y %Z\\\")(date) parses timezone offset in the form '+-hh:mm'\", () => {\n  const p = timeParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 +01:30\"), local(1990, 0, 1, 14, 30));\n  assert.deepStrictEqual(p(\"01/02/1990 -01:30\"), local(1990, 0, 1, 17, 30));\n});\n\nit(\"timeParse(\\\"%m/%d/%Y %Z\\\")(date) parses timezone offset in the form '+-hh'\", () => {\n  const p = timeParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 +01\"), local(1990, 0, 1, 15));\n  assert.deepStrictEqual(p(\"01/02/1990 -01\"), local(1990, 0, 1, 17));\n});\n\nit(\"timeParse(\\\"%m/%d/%Y %Z\\\")(date) parses timezone offset in the form 'Z'\", () => {\n  const p = timeParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 Z\"), local(1990, 0, 1, 16));\n});\n\nit(\"timeParse(\\\"%-m/%0d/%_Y\\\")(date) ignores optional padding modifier, skipping zeroes and spaces\", () => {\n  const p = timeParse(\"%-m/%0d/%_Y\");\n  assert.deepStrictEqual(p(\"01/ 1/1990\"), local(1990, 0, 1));\n});\n\nit(\"timeParse(\\\"%b %d, %Y\\\")(date) doesn't crash when given weird strings\", () => {\n  try {\n    Object.prototype.foo = 10;\n    const p = timeParse(\"%b %d, %Y\");\n    assert.strictEqual(p(\"foo 1, 1990\"), null);\n  } finally {\n    delete Object.prototype.foo;\n  }\n});\n"
  },
  {
    "path": "test/utcFormat-test.js",
    "content": "import assert from \"assert\";\nimport {utcSecond, utcMinute, utcHour, utcDay, utcMonth, utcWeek, utcYear} from \"d3-time\";\nimport {utcFormat} from \"../src/index.js\";\nimport {utc} from \"./date.js\";\n\nconst formatMillisecond = utcFormat(\".%L\"),\n    formatSecond = utcFormat(\":%S\"),\n    formatMinute = utcFormat(\"%I:%M\"),\n    formatHour = utcFormat(\"%I %p\"),\n    formatDay = utcFormat(\"%a %d\"),\n    formatWeek = utcFormat(\"%b %d\"),\n    formatMonth = utcFormat(\"%B\"),\n    formatYear = utcFormat(\"%Y\");\n\nfunction multi(d) {\n  return (utcSecond(d) < d ? formatMillisecond\n      : utcMinute(d) < d ? formatSecond\n      : utcHour(d) < d ? formatMinute\n      : utcDay(d) < d ? formatHour\n      : utcMonth(d) < d ? (utcWeek(d) < d ? formatDay : formatWeek)\n      : utcYear(d) < d ? formatMonth\n      : formatYear)(d);\n}\n\nit(\"utcFormat(\\\"%a\\\")(date) formats abbreviated weekdays\", () => {\n  const f = utcFormat(\"%a\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"Mon\");\n  assert.strictEqual(f(utc(1990, 0, 2)), \"Tue\");\n  assert.strictEqual(f(utc(1990, 0, 3)), \"Wed\");\n  assert.strictEqual(f(utc(1990, 0, 4)), \"Thu\");\n  assert.strictEqual(f(utc(1990, 0, 5)), \"Fri\");\n  assert.strictEqual(f(utc(1990, 0, 6)), \"Sat\");\n  assert.strictEqual(f(utc(1990, 0, 7)), \"Sun\");\n});\n\nit(\"utcFormat(\\\"%A\\\")(date) formats weekdays\", () => {\n  const f = utcFormat(\"%A\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"Monday\");\n  assert.strictEqual(f(utc(1990, 0, 2)), \"Tuesday\");\n  assert.strictEqual(f(utc(1990, 0, 3)), \"Wednesday\");\n  assert.strictEqual(f(utc(1990, 0, 4)), \"Thursday\");\n  assert.strictEqual(f(utc(1990, 0, 5)), \"Friday\");\n  assert.strictEqual(f(utc(1990, 0, 6)), \"Saturday\");\n  assert.strictEqual(f(utc(1990, 0, 7)), \"Sunday\");\n});\n\nit(\"utcFormat(\\\"%b\\\")(date) formats abbreviated months\", () => {\n  const f = utcFormat(\"%b\");\n  assert.strictEqual(f(utc(1990,  0, 1)), \"Jan\");\n  assert.strictEqual(f(utc(1990,  1, 1)), \"Feb\");\n  assert.strictEqual(f(utc(1990,  2, 1)), \"Mar\");\n  assert.strictEqual(f(utc(1990,  3, 1)), \"Apr\");\n  assert.strictEqual(f(utc(1990,  4, 1)), \"May\");\n  assert.strictEqual(f(utc(1990,  5, 1)), \"Jun\");\n  assert.strictEqual(f(utc(1990,  6, 1)), \"Jul\");\n  assert.strictEqual(f(utc(1990,  7, 1)), \"Aug\");\n  assert.strictEqual(f(utc(1990,  8, 1)), \"Sep\");\n  assert.strictEqual(f(utc(1990,  9, 1)), \"Oct\");\n  assert.strictEqual(f(utc(1990, 10, 1)), \"Nov\");\n  assert.strictEqual(f(utc(1990, 11, 1)), \"Dec\");\n});\n\nit(\"utcFormat(\\\"%B\\\")(date) formats months\", () => {\n  const f = utcFormat(\"%B\");\n  assert.strictEqual(f(utc(1990,  0, 1)), \"January\");\n  assert.strictEqual(f(utc(1990,  1, 1)), \"February\");\n  assert.strictEqual(f(utc(1990,  2, 1)), \"March\");\n  assert.strictEqual(f(utc(1990,  3, 1)), \"April\");\n  assert.strictEqual(f(utc(1990,  4, 1)), \"May\");\n  assert.strictEqual(f(utc(1990,  5, 1)), \"June\");\n  assert.strictEqual(f(utc(1990,  6, 1)), \"July\");\n  assert.strictEqual(f(utc(1990,  7, 1)), \"August\");\n  assert.strictEqual(f(utc(1990,  8, 1)), \"September\");\n  assert.strictEqual(f(utc(1990,  9, 1)), \"October\");\n  assert.strictEqual(f(utc(1990, 10, 1)), \"November\");\n  assert.strictEqual(f(utc(1990, 11, 1)), \"December\");\n});\n\nit(\"utcFormat(\\\"%c\\\")(date) formats localized dates and times\", () => {\n  const f = utcFormat(\"%c\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"1/1/1990, 12:00:00 AM\");\n});\n\nit(\"utcFormat(\\\"%d\\\")(date) formats zero-padded dates\", () => {\n  const f = utcFormat(\"%d\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"01\");\n});\n\nit(\"utcFormat(\\\"%e\\\")(date) formats space-padded dates\", () => {\n  const f = utcFormat(\"%e\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \" 1\");\n});\n\nit(\"timeFormat(\\\"%g\\\")(date) formats zero-padded two-digit ISO 8601 years\", () => {\n  const f = utcFormat(\"%g\");\n  assert.strictEqual(f(utc(2018, 11, 30, 0)), \"18\"); // Sunday\n  assert.strictEqual(f(utc(2018, 11, 31, 0)), \"19\"); // Monday\n  assert.strictEqual(f(utc(2019, 0, 1, 0)), \"19\");\n});\n\nit(\"utcFormat(\\\"%G\\\")(date) formats zero-padded four-digit ISO 8601 years\", () => {\n  const f = utcFormat(\"%G\");\n  assert.strictEqual(f(utc(2018, 11, 30, 0)), \"2018\"); // Sunday\n  assert.strictEqual(f(utc(2018, 11, 31, 0)), \"2019\"); // Monday\n  assert.strictEqual(f(utc(2019, 0, 1, 0)), \"2019\");\n});\n\nit(\"utcFormat(\\\"%H\\\")(date) formats zero-padded hours (24)\", () => {\n  const f = utcFormat(\"%H\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0)), \"00\");\n  assert.strictEqual(f(utc(1990, 0, 1, 13)), \"13\");\n});\n\nit(\"utcFormat(\\\"%I\\\")(date) formats zero-padded hours (12)\", () => {\n  const f = utcFormat(\"%I\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0)), \"12\");\n  assert.strictEqual(f(utc(1990, 0, 1, 13)), \"01\");\n});\n\nit(\"utcFormat(\\\"%j\\\")(date) formats zero-padded day of year numbers\", () => {\n  const f = utcFormat(\"%j\");\n  assert.strictEqual(f(utc(1990,  0,  1)), \"001\");\n  assert.strictEqual(f(utc(1990,  5,  1)), \"152\");\n  assert.strictEqual(f(utc(2010,  2, 13)), \"072\");\n  assert.strictEqual(f(utc(2010,  2, 14)), \"073\"); // DST begins\n  assert.strictEqual(f(utc(2010,  2, 15)), \"074\");\n  assert.strictEqual(f(utc(2010, 10,  6)), \"310\");\n  assert.strictEqual(f(utc(2010, 10,  7)), \"311\"); // DST ends\n  assert.strictEqual(f(utc(2010, 10,  8)), \"312\");\n});\n\nit(\"utcFormat(\\\"%m\\\")(date) formats zero-padded months\", () => {\n  const f = utcFormat(\"%m\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"01\");\n  assert.strictEqual(f(utc(1990, 9, 1)), \"10\");\n});\n\nit(\"utcFormat(\\\"%M\\\")(date) formats zero-padded minutes\", () => {\n  const f = utcFormat(\"%M\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0,  0)), \"00\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 32)), \"32\");\n});\n\nit(\"utcFormat(\\\"%p\\\")(date) formats AM or PM\", () => {\n  const f = utcFormat(\"%p\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0)), \"AM\");\n  assert.strictEqual(f(utc(1990, 0, 1, 13)), \"PM\");\n});\n\nit(\"utcFormat(\\\"%q\\\")(date) formats quarters\", () => {\n  const f = utcFormat(\"%q\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"1\");\n  assert.strictEqual(f(utc(1990, 3, 1)), \"2\");\n  assert.strictEqual(f(utc(1990, 6, 1)), \"3\");\n  assert.strictEqual(f(utc(1990, 9, 1)), \"4\");\n});\n\nit(\"utcFormat(\\\"%Q\\\")(date) formats UNIX timestamps\", () => {\n  const f = utcFormat(\"%Q\");\n  assert.strictEqual(f(utc(1970, 0, 1,  0,  0,  0)), \"0\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0,  0,  0)), \"631152000000\");\n  assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56)), \"631197296000\");\n});\n\nit(\"utcFormat(\\\"%s\\\")(date) formats UNIX timetamps in seconds\", () => {\n  const f = utcFormat(\"%s\");\n  assert.strictEqual(f(utc(1970, 0, 1,  0,  0,  0)), \"0\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0,  0,  0)), \"631152000\");\n  assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56)), \"631197296\");\n});\n\nit(\"utcFormat(\\\"%s.%L\\\")(date) formats UNIX timetamps in seconds and milliseconds\", () => {\n  const f = utcFormat(\"%s.%L\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0,  0,  0, 123)), \"631152000.123\");\n  assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56, 789)), \"631197296.789\");\n});\n\nit(\"utcFormat(\\\"%s.%f\\\")(date) formats UNIX timetamps in seconds and microseconds\", () => {\n  const f = utcFormat(\"%s.%f\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0,  0,  0, 123)), \"631152000.123000\");\n  assert.strictEqual(f(utc(1990, 0, 1, 12, 34, 56, 789)), \"631197296.789000\");\n});\n\nit(\"utcFormat(\\\"%S\\\")(date) formats zero-padded seconds\", () => {\n  const f = utcFormat(\"%S\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0,  0)), \"00\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 32)), \"32\");\n  const f2 = utcFormat(\"%0S\");\n  assert.strictEqual(f2(utc(1990, 0, 1, 0, 0,  0)), \"00\");\n  assert.strictEqual(f2(utc(1990, 0, 1, 0, 0, 32)), \"32\");\n});\n\nit(\"utcFormat(\\\"%_S\\\")(date) formats space-padded seconds\", () => {\n  const f = utcFormat(\"%_S\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0,  0)), \" 0\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0,  3)), \" 3\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 32)), \"32\");\n});\n\nit(\"utcFormat(\\\"-S\\\")(date) formats no-padded seconds\", () => {\n  const f = utcFormat(\"%-S\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0,  0)), \"0\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0,  3)), \"3\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 32)), \"32\");\n});\n\nit(\"utcFormat(\\\"%L\\\")(date) formats zero-padded milliseconds\", () => {\n  const f = utcFormat(\"%L\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0,   0)), \"000\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 432)), \"432\");\n});\n\nit(\"utcFormat(\\\"%u\\\")(date) formats week day numbers\", () => {\n  const f = utcFormat(\"%u\");\n  assert.strictEqual(f(utc(1990,  0,  1,  0)), \"1\");\n  assert.strictEqual(f(utc(1990,  0,  7,  0)), \"7\");\n  assert.strictEqual(f(utc(2010,  2, 13, 23)), \"6\");\n});\n\nit(\"utcFormat(\\\"%f\\\")(date) formats zero-padded microseconds\", () => {\n  const f = utcFormat(\"%f\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0,   0)), \"000000\");\n  assert.strictEqual(f(utc(1990, 0, 1, 0, 0, 0, 432)), \"432000\");\n});\n\nit(\"utcFormat(\\\"%U\\\")(date) formats zero-padded week numbers\", () => {\n  const f = utcFormat(\"%U\");\n  assert.strictEqual(f(utc(1990,  0,  1,  0)), \"00\");\n  assert.strictEqual(f(utc(1990,  5,  1,  0)), \"21\");\n  assert.strictEqual(f(utc(2010,  2, 13, 23)), \"10\");\n  assert.strictEqual(f(utc(2010,  2, 14,  0)), \"11\"); // DST begins\n  assert.strictEqual(f(utc(2010,  2, 15,  0)), \"11\");\n  assert.strictEqual(f(utc(2010, 10,  6, 23)), \"44\");\n  assert.strictEqual(f(utc(2010, 10,  7,  0)), \"45\"); // DST ends\n  assert.strictEqual(f(utc(2010, 10,  8,  0)), \"45\");\n  assert.strictEqual(f(utc(2012,  0,  1,  0)), \"01\"); // Sunday!\n});\n\nit(\"utcFormat(\\\"%W\\\")(date) formats zero-padded week numbers\", () => {\n  const f = utcFormat(\"%W\");\n  assert.strictEqual(f(utc(1990,  0,  1,  0)), \"01\"); // Monday!\n  assert.strictEqual(f(utc(1990,  5,  1,  0)), \"22\");\n  assert.strictEqual(f(utc(2010,  2, 15,  0)), \"11\");\n  assert.strictEqual(f(utc(2010, 10,  8,  0)), \"45\");\n});\n\nit(\"utcFormat(\\\"%V\\\")(date) formats zero-padded ISO 8601 week numbers\", () => {\n  const f = utcFormat(\"%V\");\n  assert.strictEqual(f(utc(1990,  0,  1,  0)), \"01\");\n  assert.strictEqual(f(utc(1990,  5,  1,  0)), \"22\");\n  assert.strictEqual(f(utc(2010,  2, 13, 23)), \"10\");\n  assert.strictEqual(f(utc(2010,  2, 14,  0)), \"10\"); // DST begins\n  assert.strictEqual(f(utc(2010,  2, 15,  0)), \"11\");\n  assert.strictEqual(f(utc(2010, 10,  6, 23)), \"44\");\n  assert.strictEqual(f(utc(2010, 10,  7,  0)), \"44\"); // DST ends\n  assert.strictEqual(f(utc(2010, 10,  8,  0)), \"45\");\n  assert.strictEqual(f(utc(2015, 11,  31, 0)), \"53\");\n  assert.strictEqual(f(utc(2016,  0,  1,  0)), \"53\");\n});\n\nit(\"utcFormat(\\\"%x\\\")(date) formats localized dates\", () => {\n  const f = utcFormat(\"%x\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"1/1/1990\");\n  assert.strictEqual(f(utc(2010, 5, 1)), \"6/1/2010\");\n});\n\nit(\"utcFormat(\\\"%X\\\")(date) formats localized times\", () => {\n  const f = utcFormat(\"%X\");\n  assert.strictEqual(f(utc(1990, 0, 1,  0,  0,  0)), \"12:00:00 AM\");\n  assert.strictEqual(f(utc(1990, 0, 1, 13, 34, 59)), \"1:34:59 PM\");\n});\n\nit(\"utcFormat(\\\"%y\\\")(date) formats zero-padded two-digit years\", () => {\n  const f = utcFormat(\"%y\");\n  assert.strictEqual(f(utc(+1990, 0, 1)), \"90\");\n  assert.strictEqual(f(utc(+2002, 0, 1)), \"02\");\n  assert.strictEqual(f(utc(-2, 0, 1)), \"-02\");\n});\n\nit(\"utcFormat(\\\"%Y\\\")(date) formats zero-padded four-digit years\", () => {\n  const f = utcFormat(\"%Y\");\n  assert.strictEqual(f(utc(  123, 0, 1)), \"0123\");\n  assert.strictEqual(f(utc( 1990, 0, 1)), \"1990\");\n  assert.strictEqual(f(utc( 2002, 0, 1)), \"2002\");\n  assert.strictEqual(f(utc(10002, 0, 1)), \"0002\");\n  assert.strictEqual(f(utc(   -2, 0, 1)), \"-0002\");\n});\n\nit(\"utcFormat(\\\"%Z\\\")(date) formats time zones\", () => {\n  const f = utcFormat(\"%Z\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"+0000\");\n});\n\nit(\"utcFormat(\\\"%%\\\")(date) formats literal percent signs\", () => {\n  const f = utcFormat(\"%%\");\n  assert.strictEqual(f(utc(1990, 0, 1)), \"%\");\n});\n\nit(\"utcFormat(…) can be used to create a conditional multi-format\", () => {\n  assert.strictEqual(multi(utc(1990, 0, 1, 0, 0, 0, 12)), \".012\");\n  assert.strictEqual(multi(utc(1990, 0, 1, 0, 0, 1,  0)), \":01\");\n  assert.strictEqual(multi(utc(1990, 0, 1, 0, 1, 0,  0)), \"12:01\");\n  assert.strictEqual(multi(utc(1990, 0, 1, 1, 0, 0,  0)), \"01 AM\");\n  assert.strictEqual(multi(utc(1990, 0, 2, 0, 0, 0,  0)), \"Tue 02\");\n  assert.strictEqual(multi(utc(1990, 1, 1, 0, 0, 0,  0)), \"February\");\n  assert.strictEqual(multi(utc(1990, 0, 1, 0, 0, 0,  0)), \"1990\");\n});\n"
  },
  {
    "path": "test/utcParse-test.js",
    "content": "import assert from \"assert\";\nimport {utcParse} from \"../src/index.js\";\nimport {local, utc} from \"./date.js\";\n\nit(\"utcParse(specifier) coerces the specified specifier to a string\", () => {\n  const p = utcParse({toString: function() { return \"%c\"; }});\n  assert.deepStrictEqual(p(\"1/1/1990, 12:00:00 AM\"), utc(1990, 0, 1));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses abbreviated weekday and numeric date\", () => {\n  const p = utcParse(\"%a %m/%d/%Y\");\n  assert.deepStrictEqual(p(\"Sun 01/01/1990\"), utc(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Wed 02/03/1991\"), utc(1991, 1, 3));\n  assert.strictEqual(p(\"XXX 03/10/2010\"), null);\n});\n\nit(\"utcParse(\\\"\\\")(date) parses weekday and numeric date\", () => {\n  const p = utcParse(\"%A %m/%d/%Y\");\n  assert.deepStrictEqual(p(\"Sunday 01/01/1990\"), utc(1990, 0, 1));\n  assert.deepStrictEqual(p(\"Wednesday 02/03/1991\"), utc(1991, 1, 3));\n  assert.strictEqual(p(\"Caturday 03/10/2010\"), null);\n});\n\nit(\"utcParse(\\\"\\\")(date) parses numeric date\", () => {\n  const p = utcParse(\"%m/%d/%y\");\n  assert.deepStrictEqual(p(\"01/01/90\"), utc(1990, 0, 1));\n  assert.deepStrictEqual(p(\"02/03/91\"), utc(1991, 1, 3));\n  assert.strictEqual(p(\"03/10/2010\"), null);\n});\n\nit(\"utcParse(\\\"\\\")(date) parses locale date\", () => {\n  const p = utcParse(\"%x\");\n  assert.deepStrictEqual(p(\"01/01/1990\"), utc(1990, 0, 1));\n  assert.deepStrictEqual(p(\"02/03/1991\"), utc(1991, 1, 3));\n  assert.deepStrictEqual(p(\"03/10/2010\"), utc(2010, 2, 10));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses abbreviated month, date and year\", () => {\n  const p = utcParse(\"%b %d, %Y\");\n  assert.deepStrictEqual(p(\"jan 01, 1990\"), utc(1990, 0, 1));\n  assert.deepStrictEqual(p(\"feb  2, 2010\"), utc(2010, 1, 2));\n  assert.strictEqual(p(\"jan. 1, 1990\"), null);\n});\n\nit(\"utcParse(\\\"\\\")(date) parses month, date and year\", () => {\n  const p = utcParse(\"%B %d, %Y\");\n  assert.deepStrictEqual(p(\"january 01, 1990\"), utc(1990, 0, 1));\n  assert.deepStrictEqual(p(\"February  2, 2010\"), utc(2010, 1, 2));\n  assert.strictEqual(p(\"jan 1, 1990\"), null);\n});\n\nit(\"utcParse(\\\"\\\")(date) parses locale date and time\", () => {\n  const p = utcParse(\"%c\");\n  assert.deepStrictEqual(p(\"1/1/1990, 12:00:00 AM\"), utc(1990, 0, 1));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses twenty-four hour, minute and second\", () => {\n  const p = utcParse(\"%H:%M:%S\");\n  assert.deepStrictEqual(p(\"00:00:00\"), utc(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59\"), utc(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00\"), utc(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01\"), utc(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"23:59:59\"), utc(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses locale time\", () => {\n  const p = utcParse(\"%X\");\n  assert.deepStrictEqual(p(\"12:00:00 AM\"), utc(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59 AM\"), utc(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00 PM\"), utc(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01 PM\"), utc(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"11:59:59 PM\"), utc(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"utcParse(\\\"%L\\\")(date) parses milliseconds\", () => {\n  const p = utcParse(\"%L\");\n  assert.deepStrictEqual(p(\"432\"), utc(1900, 0, 1, 0, 0, 0, 432));\n});\n\nit(\"utcParse(\\\"%f\\\")(date) parses microseconds\", () => {\n  const p = utcParse(\"%f\");\n  assert.deepStrictEqual(p(\"432000\"), utc(1900, 0, 1, 0, 0, 0, 432));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses twelve hour, minute and second\", () => {\n  const p = utcParse(\"%I:%M:%S %p\");\n  assert.deepStrictEqual(p(\"12:00:00 am\"), utc(1900, 0, 1, 0, 0, 0));\n  assert.deepStrictEqual(p(\"11:59:59 AM\"), utc(1900, 0, 1, 11, 59, 59));\n  assert.deepStrictEqual(p(\"12:00:00 pm\"), utc(1900, 0, 1, 12, 0, 0));\n  assert.deepStrictEqual(p(\"12:00:01 pm\"), utc(1900, 0, 1, 12, 0, 1));\n  assert.deepStrictEqual(p(\"11:59:59 PM\"), utc(1900, 0, 1, 23, 59, 59));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses timezone offset\", () => {\n  const p = utcParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 +0000\"), utc(1990, 0, 2));\n  assert.deepStrictEqual(p(\"01/02/1990 +0100\"), utc(1990, 0, 1, 23));\n  assert.deepStrictEqual(p(\"01/02/1990 -0100\"), utc(1990, 0, 2, 1));\n  assert.deepStrictEqual(p(\"01/02/1990 -0800\"), local(1990, 0, 2));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses timezone offset (in the form '+-hh:mm')\", () => {\n  const p = utcParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 +01:30\"), utc(1990, 0, 1, 22, 30));\n  assert.deepStrictEqual(p(\"01/02/1990 -01:30\"), utc(1990, 0, 2, 1, 30));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses timezone offset (in the form '+-hh')\", () => {\n  const p = utcParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 +01\"), utc(1990, 0, 1, 23));\n  assert.deepStrictEqual(p(\"01/02/1990 -01\"), utc(1990, 0, 2, 1));\n});\n\nit(\"utcParse(\\\"\\\")(date) parses timezone offset (in the form 'Z')\", () => {\n  const p = utcParse(\"%m/%d/%Y %Z\");\n  assert.deepStrictEqual(p(\"01/02/1990 Z\"), utc(1990, 0, 2));\n});\n\nit(\"utcParse(\\\"%Y %U %w\\\")(date) handles a year that starts on Sunday\", () => {\n  const p = utcParse(\"%Y %U %w\");\n  assert.deepStrictEqual(p(\"2012 01 0\"), utc(2012,  0,  1));\n});\n\nit(\"utcParse(\\\"%w %V %Y\\\")(date) parses numeric weekday, week number (ISO) and year\", () => {\n  const p = utcParse(\"%w %V %Y\");\n  assert.deepStrictEqual(p(\"1 01 1990\"), utc(1990,  0,  1));\n  assert.deepStrictEqual(p(\"0 05 1991\"), utc(1991,  1,  3));\n  assert.deepStrictEqual(p(\"4 53 1992\"), utc(1992, 11, 31));\n  assert.deepStrictEqual(p(\"0 52 1994\"), utc(1995,  0,  1));\n  assert.deepStrictEqual(p(\"0 01 1995\"), utc(1995,  0,  8));\n  assert.strictEqual(p(\"X 03 2010\"), null);\n});\n\nit(\"utcParse(\\\"%w %V %G\\\")(date) parses numeric weekday, week number (ISO) and corresponding year\", () => {\n  const p = utcParse(\"%w %V %G\");\n  assert.deepStrictEqual(p(\"1 01 1990\"), utc(1990,  0,  1));\n  assert.deepStrictEqual(p(\"0 05 1991\"), utc(1991,  1,  3));\n  assert.deepStrictEqual(p(\"4 53 1992\"), utc(1992, 11, 31));\n  assert.deepStrictEqual(p(\"0 52 1994\"), utc(1995,  0,  1));\n  assert.deepStrictEqual(p(\"0 01 1995\"), utc(1995,  0,  8));\n  assert.deepStrictEqual(p(\"1 01 2018\"), utc(2018, 0, 1));\n  assert.deepStrictEqual(p(\"1 01 2019\"), utc(2018, 11, 31));\n  assert.strictEqual(p(\"X 03 2010\"), null);\n});\n\nit(\"utcParse(\\\"%V %Y\\\")(date) week number (ISO) and year\", () => {\n  const p = utcParse(\"%V %Y\");\n  assert.deepStrictEqual(p(\"01 1990\"), utc(1990,  0,  1));\n  assert.deepStrictEqual(p(\"05 1991\"), utc(1991,  0, 28));\n  assert.deepStrictEqual(p(\"53 1992\"), utc(1992, 11, 28));\n  assert.deepStrictEqual(p(\"01 1993\"), utc(1993,  0,  4));\n  assert.deepStrictEqual(p(\"01 1995\"), utc(1995,  0,  2));\n  assert.deepStrictEqual(p(\"00 1995\"), null);\n  assert.deepStrictEqual(p(\"54 1995\"), null);\n  assert.deepStrictEqual(p(\"X 1995\"), null);\n});\n\nit(\"utcParse(\\\"%V %g\\\")(date) week number (ISO) and corresponding two-digits year\", () => {\n  const p = utcParse(\"%V %g\");\n  assert.deepStrictEqual(p(\"01 90\"), utc(1990,  0,  1));\n  assert.deepStrictEqual(p(\"05 91\"), utc(1991,  0, 28));\n  assert.deepStrictEqual(p(\"53 92\"), utc(1992, 11, 28));\n  assert.deepStrictEqual(p(\"01 93\"), utc(1993,  0,  4));\n  assert.deepStrictEqual(p(\"01 95\"), utc(1995, 0, 2));\n  assert.deepStrictEqual(p(\"01 18\"), utc(2018, 0, 1));\n  assert.deepStrictEqual(p(\"01 19\"), utc(2018, 11, 31));\n  assert.deepStrictEqual(p(\"00 95\"), null);\n  assert.deepStrictEqual(p(\"54 95\"), null);\n  assert.deepStrictEqual(p(\"X 95\"), null);\n});\n\nit(\"utcParse(\\\"%V %G\\\")(date) week number (ISO) and corresponding year\", () => {\n  const p = utcParse(\"%V %G\");\n  assert.deepStrictEqual(p(\"01 1990\"), utc(1990,  0,  1));\n  assert.deepStrictEqual(p(\"05 1991\"), utc(1991,  0, 28));\n  assert.deepStrictEqual(p(\"53 1992\"), utc(1992, 11, 28));\n  assert.deepStrictEqual(p(\"01 1993\"), utc(1993,  0,  4));\n  assert.deepStrictEqual(p(\"01 1995\"), utc(1995, 0, 2));\n  assert.deepStrictEqual(p(\"01 2018\"), utc(2018, 0, 1));\n  assert.deepStrictEqual(p(\"01 2019\"), utc(2018, 11, 31));\n  assert.deepStrictEqual(p(\"00 1995\"), null);\n  assert.deepStrictEqual(p(\"54 1995\"), null);\n  assert.deepStrictEqual(p(\"X 1995\"), null);\n});\n\nit(\"utcParse(\\\"%Q\\\")(date) parses UNIX timestamps\", () => {\n  const p = utcParse(\"%Q\");\n  assert.deepStrictEqual(p(\"0\"), utc(1970, 0, 1));\n  assert.deepStrictEqual(p(\"631152000000\"), utc(1990, 0, 1));\n});\n\nit(\"utcParse(\\\"%s\\\")(date) parses UNIX timestamps in seconds\", () => {\n  const p = utcParse(\"%s\");\n  assert.deepStrictEqual(p(\"0\"), utc(1970, 0, 1));\n  assert.deepStrictEqual(p(\"631152000\"), utc(1990, 0, 1));\n});\n\nit(\"utcParse(\\\"%s.%L\\\")(date) parses UNIX timetamps in seconds and milliseconds\", () => {\n  const p = utcParse(\"%s.%L\");\n  assert.deepStrictEqual(p(\"631152000.123\"), utc(1990, 0, 1,  0,  0,  0, 123));\n  assert.deepStrictEqual(p(\"631197296.789\"), utc(1990, 0, 1, 12, 34, 56, 789));\n});\n\nit(\"utcParse(\\\"%s.%f\\\")(date) parses UNIX timetamps in seconds and microseconds\", () => {\n  const p = utcParse(\"%s.%f\");\n  assert.deepStrictEqual(p(\"631152000.123000\"), utc(1990, 0, 1,  0,  0,  0, 123));\n  assert.deepStrictEqual(p(\"631197296.789000\"), utc(1990, 0, 1, 12, 34, 56, 789));\n});\n"
  }
]