SPB Git forge

spb/uqo-eval

Public
55commits 2branches 0releases
134.4 MBsize
maindefault branch
3 h agolast push
TypeScript 90.1% JavaScript 3.2% Python 3.2% CSS 1.8% HTML 1.8%

La mesure à l'épreuve du marché (/stats/marche) : merge de la base Immo-Ka (copie immoka.db, table uqo_eval) avec le moteur — 49 111 annonces actives évaluées, ratio médian 0,938, MdAPE 19,1 % vs prix demandé, calibration A-D vérifiée ; pipeline eval-immoka.ts (6 shards) + build-marche-stats.mjs + teaser /stats

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 29, 2026) parent db4fbcd

11 changed files +1,292 −1

modified package-lock.json +504 −0
@@ -28,6 +28,7 @@
28 28 "eslint-config-next": "16.3.0",
29 29 "playwright": "^1.62.1",
30 30 "tailwindcss": "^4",
31 + "tsx": "^4.23.12",
31 32 "typescript": "^5",
32 33 "vitest": "^4.1.10"
33 34 }
@@ -348,6 +349,448 @@
348 349 "tslib": "^2.4.0"
349 350 }
350 351 },
352 + "node_modules/@esbuild/aix-ppc64": {
353 + "version": "0.28.2",
354 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
355 + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
356 + "cpu": [
357 + "ppc64"
358 + ],
359 + "dev": true,
360 + "license": "MIT",
361 + "optional": true,
362 + "os": [
363 + "aix"
364 + ],
365 + "engines": {
366 + "node": ">=18"
367 + }
368 + },
369 + "node_modules/@esbuild/android-arm": {
370 + "version": "0.28.2",
371 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
372 + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
373 + "cpu": [
374 + "arm"
375 + ],
376 + "dev": true,
377 + "license": "MIT",
378 + "optional": true,
379 + "os": [
380 + "android"
381 + ],
382 + "engines": {
383 + "node": ">=18"
384 + }
385 + },
386 + "node_modules/@esbuild/android-arm64": {
387 + "version": "0.28.2",
388 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
389 + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
390 + "cpu": [
391 + "arm64"
392 + ],
393 + "dev": true,
394 + "license": "MIT",
395 + "optional": true,
396 + "os": [
397 + "android"
398 + ],
399 + "engines": {
400 + "node": ">=18"
401 + }
402 + },
403 + "node_modules/@esbuild/android-x64": {
404 + "version": "0.28.2",
405 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
406 + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
407 + "cpu": [
408 + "x64"
409 + ],
410 + "dev": true,
411 + "license": "MIT",
412 + "optional": true,
413 + "os": [
414 + "android"
415 + ],
416 + "engines": {
417 + "node": ">=18"
418 + }
419 + },
420 + "node_modules/@esbuild/darwin-arm64": {
421 + "version": "0.28.2",
422 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
423 + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
424 + "cpu": [
425 + "arm64"
426 + ],
427 + "dev": true,
428 + "license": "MIT",
429 + "optional": true,
430 + "os": [
431 + "darwin"
432 + ],
433 + "engines": {
434 + "node": ">=18"
435 + }
436 + },
437 + "node_modules/@esbuild/darwin-x64": {
438 + "version": "0.28.2",
439 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
440 + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
441 + "cpu": [
442 + "x64"
443 + ],
444 + "dev": true,
445 + "license": "MIT",
446 + "optional": true,
447 + "os": [
448 + "darwin"
449 + ],
450 + "engines": {
451 + "node": ">=18"
452 + }
453 + },
454 + "node_modules/@esbuild/freebsd-arm64": {
455 + "version": "0.28.2",
456 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
457 + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
458 + "cpu": [
459 + "arm64"
460 + ],
461 + "dev": true,
462 + "license": "MIT",
463 + "optional": true,
464 + "os": [
465 + "freebsd"
466 + ],
467 + "engines": {
468 + "node": ">=18"
469 + }
470 + },
471 + "node_modules/@esbuild/freebsd-x64": {
472 + "version": "0.28.2",
473 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
474 + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
475 + "cpu": [
476 + "x64"
477 + ],
478 + "dev": true,
479 + "license": "MIT",
480 + "optional": true,
481 + "os": [
482 + "freebsd"
483 + ],
484 + "engines": {
485 + "node": ">=18"
486 + }
487 + },
488 + "node_modules/@esbuild/linux-arm": {
489 + "version": "0.28.2",
490 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
491 + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
492 + "cpu": [
493 + "arm"
494 + ],
495 + "dev": true,
496 + "license": "MIT",
497 + "optional": true,
498 + "os": [
499 + "linux"
500 + ],
501 + "engines": {
502 + "node": ">=18"
503 + }
504 + },
505 + "node_modules/@esbuild/linux-arm64": {
506 + "version": "0.28.2",
507 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
508 + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
509 + "cpu": [
510 + "arm64"
511 + ],
512 + "dev": true,
513 + "license": "MIT",
514 + "optional": true,
515 + "os": [
516 + "linux"
517 + ],
518 + "engines": {
519 + "node": ">=18"
520 + }
521 + },
522 + "node_modules/@esbuild/linux-ia32": {
523 + "version": "0.28.2",
524 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
525 + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
526 + "cpu": [
527 + "ia32"
528 + ],
529 + "dev": true,
530 + "license": "MIT",
531 + "optional": true,
532 + "os": [
533 + "linux"
534 + ],
535 + "engines": {
536 + "node": ">=18"
537 + }
538 + },
539 + "node_modules/@esbuild/linux-loong64": {
540 + "version": "0.28.2",
541 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
542 + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
543 + "cpu": [
544 + "loong64"
545 + ],
546 + "dev": true,
547 + "license": "MIT",
548 + "optional": true,
549 + "os": [
550 + "linux"
551 + ],
552 + "engines": {
553 + "node": ">=18"
554 + }
555 + },
556 + "node_modules/@esbuild/linux-mips64el": {
557 + "version": "0.28.2",
558 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
559 + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
560 + "cpu": [
561 + "mips64el"
562 + ],
563 + "dev": true,
564 + "license": "MIT",
565 + "optional": true,
566 + "os": [
567 + "linux"
568 + ],
569 + "engines": {
570 + "node": ">=18"
571 + }
572 + },
573 + "node_modules/@esbuild/linux-ppc64": {
574 + "version": "0.28.2",
575 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
576 + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
577 + "cpu": [
578 + "ppc64"
579 + ],
580 + "dev": true,
581 + "license": "MIT",
582 + "optional": true,
583 + "os": [
584 + "linux"
585 + ],
586 + "engines": {
587 + "node": ">=18"
588 + }
589 + },
590 + "node_modules/@esbuild/linux-riscv64": {
591 + "version": "0.28.2",
592 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
593 + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
594 + "cpu": [
595 + "riscv64"
596 + ],
597 + "dev": true,
598 + "license": "MIT",
599 + "optional": true,
600 + "os": [
601 + "linux"
602 + ],
603 + "engines": {
604 + "node": ">=18"
605 + }
606 + },
607 + "node_modules/@esbuild/linux-s390x": {
608 + "version": "0.28.2",
609 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
610 + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
611 + "cpu": [
612 + "s390x"
613 + ],
614 + "dev": true,
615 + "license": "MIT",
616 + "optional": true,
617 + "os": [
618 + "linux"
619 + ],
620 + "engines": {
621 + "node": ">=18"
622 + }
623 + },
624 + "node_modules/@esbuild/linux-x64": {
625 + "version": "0.28.2",
626 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
627 + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
628 + "cpu": [
629 + "x64"
630 + ],
631 + "dev": true,
632 + "license": "MIT",
633 + "optional": true,
634 + "os": [
635 + "linux"
636 + ],
637 + "engines": {
638 + "node": ">=18"
639 + }
640 + },
641 + "node_modules/@esbuild/netbsd-arm64": {
642 + "version": "0.28.2",
643 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
644 + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
645 + "cpu": [
646 + "arm64"
647 + ],
648 + "dev": true,
649 + "license": "MIT",
650 + "optional": true,
651 + "os": [
652 + "netbsd"
653 + ],
654 + "engines": {
655 + "node": ">=18"
656 + }
657 + },
658 + "node_modules/@esbuild/netbsd-x64": {
659 + "version": "0.28.2",
660 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
661 + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
662 + "cpu": [
663 + "x64"
664 + ],
665 + "dev": true,
666 + "license": "MIT",
667 + "optional": true,
668 + "os": [
669 + "netbsd"
670 + ],
671 + "engines": {
672 + "node": ">=18"
673 + }
674 + },
675 + "node_modules/@esbuild/openbsd-arm64": {
676 + "version": "0.28.2",
677 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
678 + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
679 + "cpu": [
680 + "arm64"
681 + ],
682 + "dev": true,
683 + "license": "MIT",
684 + "optional": true,
685 + "os": [
686 + "openbsd"
687 + ],
688 + "engines": {
689 + "node": ">=18"
690 + }
691 + },
692 + "node_modules/@esbuild/openbsd-x64": {
693 + "version": "0.28.2",
694 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
695 + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
696 + "cpu": [
697 + "x64"
698 + ],
699 + "dev": true,
700 + "license": "MIT",
701 + "optional": true,
702 + "os": [
703 + "openbsd"
704 + ],
705 + "engines": {
706 + "node": ">=18"
707 + }
708 + },
709 + "node_modules/@esbuild/openharmony-arm64": {
710 + "version": "0.28.2",
711 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
712 + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
713 + "cpu": [
714 + "arm64"
715 + ],
716 + "dev": true,
717 + "license": "MIT",
718 + "optional": true,
719 + "os": [
720 + "openharmony"
721 + ],
722 + "engines": {
723 + "node": ">=18"
724 + }
725 + },
726 + "node_modules/@esbuild/sunos-x64": {
727 + "version": "0.28.2",
728 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
729 + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
730 + "cpu": [
731 + "x64"
732 + ],
733 + "dev": true,
734 + "license": "MIT",
735 + "optional": true,
736 + "os": [
737 + "sunos"
738 + ],
739 + "engines": {
740 + "node": ">=18"
741 + }
742 + },
743 + "node_modules/@esbuild/win32-arm64": {
744 + "version": "0.28.2",
745 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
746 + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
747 + "cpu": [
748 + "arm64"
749 + ],
750 + "dev": true,
751 + "license": "MIT",
752 + "optional": true,
753 + "os": [
754 + "win32"
755 + ],
756 + "engines": {
757 + "node": ">=18"
758 + }
759 + },
760 + "node_modules/@esbuild/win32-ia32": {
761 + "version": "0.28.2",
762 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
763 + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
764 + "cpu": [
765 + "ia32"
766 + ],
767 + "dev": true,
768 + "license": "MIT",
769 + "optional": true,
770 + "os": [
771 + "win32"
772 + ],
773 + "engines": {
774 + "node": ">=18"
775 + }
776 + },
777 + "node_modules/@esbuild/win32-x64": {
778 + "version": "0.28.2",
779 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
780 + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
781 + "cpu": [
782 + "x64"
783 + ],
784 + "dev": true,
785 + "license": "MIT",
786 + "optional": true,
787 + "os": [
788 + "win32"
789 + ],
790 + "engines": {
791 + "node": ">=18"
792 + }
793 + },
351 794 "node_modules/@eslint-community/eslint-utils": {
352 795 "version": "4.10.1",
353 796 "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
@@ -3913,6 +4356,48 @@
3913 4356 "url": "https://github.com/sponsors/ljharb"
3914 4357 }
3915 4358 },
4359 + "node_modules/esbuild": {
4360 + "version": "0.28.2",
4361 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
4362 + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
4363 + "dev": true,
4364 + "hasInstallScript": true,
4365 + "license": "MIT",
4366 + "bin": {
4367 + "esbuild": "bin/esbuild"
4368 + },
4369 + "engines": {
4370 + "node": ">=18"
4371 + },
4372 + "optionalDependencies": {
4373 + "@esbuild/aix-ppc64": "0.28.2",
4374 + "@esbuild/android-arm": "0.28.2",
4375 + "@esbuild/android-arm64": "0.28.2",
4376 + "@esbuild/android-x64": "0.28.2",
4377 + "@esbuild/darwin-arm64": "0.28.2",
4378 + "@esbuild/darwin-x64": "0.28.2",
4379 + "@esbuild/freebsd-arm64": "0.28.2",
4380 + "@esbuild/freebsd-x64": "0.28.2",
4381 + "@esbuild/linux-arm": "0.28.2",
4382 + "@esbuild/linux-arm64": "0.28.2",
4383 + "@esbuild/linux-ia32": "0.28.2",
4384 + "@esbuild/linux-loong64": "0.28.2",
4385 + "@esbuild/linux-mips64el": "0.28.2",
4386 + "@esbuild/linux-ppc64": "0.28.2",
4387 + "@esbuild/linux-riscv64": "0.28.2",
4388 + "@esbuild/linux-s390x": "0.28.2",
4389 + "@esbuild/linux-x64": "0.28.2",
4390 + "@esbuild/netbsd-arm64": "0.28.2",
4391 + "@esbuild/netbsd-x64": "0.28.2",
4392 + "@esbuild/openbsd-arm64": "0.28.2",
4393 + "@esbuild/openbsd-x64": "0.28.2",
4394 + "@esbuild/openharmony-arm64": "0.28.2",
4395 + "@esbuild/sunos-x64": "0.28.2",
4396 + "@esbuild/win32-arm64": "0.28.2",
4397 + "@esbuild/win32-ia32": "0.28.2",
4398 + "@esbuild/win32-x64": "0.28.2"
4399 + }
4400 + },
3916 4401 "node_modules/escalade": {
3917 4402 "version": "3.2.0",
3918 4403 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -7437,6 +7922,25 @@
7437 7922 "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
7438 7923 "license": "0BSD"
7439 7924 },
7925 + "node_modules/tsx": {
7926 + "version": "4.23.12",
7927 + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz",
7928 + "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==",
7929 + "dev": true,
7930 + "license": "MIT",
7931 + "dependencies": {
7932 + "esbuild": "~0.28.0"
7933 + },
7934 + "bin": {
7935 + "tsx": "dist/cli.mjs"
7936 + },
7937 + "engines": {
7938 + "node": ">=18.0.0"
7939 + },
7940 + "optionalDependencies": {
7941 + "fsevents": "~2.3.3"
7942 + }
7943 + },
7440 7944 "node_modules/type-check": {
7441 7945 "version": "0.4.0",
7442 7946 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
modified package.json +2 −1
@@ -30,7 +30,8 @@
30 30 "eslint-config-next": "16.3.0",
31 31 "playwright": "^1.62.1",
32 32 "tailwindcss": "^4",
33 + "tsx": "^4.23.12",
33 34 "typescript": "^5",
34 35 "vitest": "^4.1.10"
35 36 }
36 −}
\ No newline at end of file
37 +}
added scripts/build-marche-stats.mjs +197 −0
@@ -0,0 +1,197 @@
1 +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai
2 +/**
3 + * scripts/build-marche-stats.mjs — fusion des shards d'évaluation Immo-Ka
4 + * (tmp/eval-shards/*.jsonl, produits par scripts/eval-immoka.ts) :
5 + * 1. écrit la table `uqo_eval` dans data/immoka.db (le « merge » annonce ↔
6 + * estimation UQO Éval, requêtable en SQL) ;
7 + * 2. calcule src/data/marche-stats.json — performance de la mesure face aux
8 + * prix demandés du marché actif, servi par /stats/marche.
9 + * Données 100 % réelles — aucune valeur inventée. À relancer quand la copie
10 + * d'immoka.db ou le moteur change.
11 + */
12 +import Database from "better-sqlite3";
13 +import { readdirSync, readFileSync, writeFileSync } from "fs";
14 +import path from "path";
15 +
16 +const IMMOKA_DB = process.env.IMMOKA_DB ?? path.join(process.cwd(), "data", "immoka.db");
17 +const SHARD_DIR = path.join(process.cwd(), "tmp", "eval-shards");
18 +
19 +/* ---------------- 1. fusion des shards → table uqo_eval ---------------- */
20 +const files = readdirSync(SHARD_DIR).filter((f) => f.endsWith(".jsonl"));
21 +if (!files.length) throw new Error(`aucun shard dans ${SHARD_DIR}`);
22 +const rows = files.flatMap((f) =>
23 + readFileSync(path.join(SHARD_DIR, f), "utf8")
24 + .split("\n")
25 + .filter(Boolean)
26 + .map((l) => JSON.parse(l))
27 +);
28 +console.log(`${rows.length} évaluations lues (${files.length} shards)`);
29 +
30 +const db = new Database(IMMOKA_DB);
31 +db.pragma("journal_mode = WAL");
32 +db.exec(`
33 + DROP TABLE IF EXISTS uqo_eval;
34 + CREATE TABLE uqo_eval (
35 + uid TEXT PRIMARY KEY, -- listings.uid (annonce Immo-Ka)
36 + unit_id TEXT, -- units.id_provinc (rôle MAMH)
37 + price REAL, -- prix demandé au moment de la copie
38 + est REAL, low REAL, high REAL, -- estimation UQO Éval + P10-P90
39 + confidence_pct REAL, confidence TEXT,
40 + model_est REAL, comps_est REAL, model_weight REAL, n_comps INTEGER,
41 + valeur_role REAL, type_prop TEXT, municipalite TEXT,
42 + ratio REAL, -- est / prix demandé
43 + evaluated_at TEXT
44 + );
45 +`);
46 +const ins = db.prepare(`
47 + INSERT OR REPLACE INTO uqo_eval VALUES
48 + (@uid,@unit_id,@price,@est,@low,@high,@cpct,@clevel,@model,@comps,@mw,@ncomps,
49 + @role,@type,@muni,@ratio,@at)`);
50 +const at = new Date().toISOString().slice(0, 10);
51 +db.transaction(() => {
52 + for (const r of rows)
53 + ins.run({ ...r, ratio: r.price > 0 && r.est > 0 ? r.est / r.price : null, at });
54 +})();
55 +console.log("table uqo_eval écrite dans", IMMOKA_DB);
56 +
57 +/* ---------------- 2. agrégats → src/data/marche-stats.json ---------------- */
58 +const median = (xs) => {
59 + if (!xs.length) return null;
60 + const s = [...xs].sort((a, b) => a - b);
61 + const m = Math.floor(s.length / 2);
62 + return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
63 +};
64 +const r4 = (v) => (v == null ? null : Math.round(v * 10000) / 10000);
65 +
66 +// univers : annonces résidentielles plausibles (≥ 50 000 $, même seuil que les
67 +// ventes retenues par le moteur) avec estimation positive
68 +const val = db
69 + .prepare(
70 + `SELECT e.uid, e.price, e.est, e.low, e.high, e.confidence AS lvl, e.n_comps,
71 + e.valeur_role, e.type_prop, l.region, l.city, l.property_type,
72 + l.bedrooms
73 + FROM uqo_eval e JOIN listings l ON l.uid = e.uid
74 + WHERE e.price >= 50000 AND e.est > 0`
75 + )
76 + .all();
77 +
78 +const totalListings = db
79 + .prepare(
80 + `SELECT COUNT(*) AS n FROM listings
81 + WHERE status='a-vendre' AND published=1 AND active=1 AND dup_hidden=0 AND price>0`
82 + )
83 + .get().n;
84 +const matched = db
85 + .prepare(
86 + `SELECT COUNT(*) AS n FROM listings
87 + WHERE status='a-vendre' AND published=1 AND active=1 AND dup_hidden=0 AND price>0
88 + AND vraiprix IS NOT NULL AND vraiprix != ''`
89 + )
90 + .get().n;
91 +
92 +const stats = (subset) => {
93 + const ratios = subset.map((r) => r.est / r.price);
94 + const apes = subset.map((r) => Math.abs(r.est - r.price) / r.price);
95 + const inRange = subset.filter((r) => r.price >= r.low && r.price <= r.high).length;
96 + return {
97 + n: subset.length,
98 + medianRatio: r4(median(ratios)),
99 + mdape: r4(median(apes)),
100 + within10: r4(apes.filter((a) => a <= 0.1).length / (apes.length || 1)),
101 + within20: r4(apes.filter((a) => a <= 0.2).length / (apes.length || 1)),
102 + askAbove: r4(subset.filter((r) => r.price > r.est).length / (subset.length || 1)),
103 + inP10P90: r4(inRange / (subset.length || 1)),
104 + medianAsk: median(subset.map((r) => r.price)),
105 + medianEst: median(subset.map((r) => r.est)),
106 + };
107 +};
108 +
109 +// clés géographiques : les sources d'Immo-Ka mélangent accents et graphies
110 +// (« Montreal » / « Montréal ») et laissent parfois la région vide → on groupe
111 +// sur une clé pliée (minuscules sans accents) et on affiche la graphie la plus
112 +// fréquente ; les vides sont exclus.
113 +const fold = (s) =>
114 + s
115 + .normalize("NFD")
116 + .replace(/[\u0300-\u036f]/g, "")
117 + .toLowerCase()
118 + .trim();
119 +const groupBy = (key, { normalize = false } = {}) => {
120 + const m = new Map();
121 + for (const r of val) {
122 + const raw = (r[key] ?? "").toString().trim();
123 + if (normalize && !raw) continue;
124 + const k = normalize ? fold(raw) : raw || "?";
125 + if (!m.has(k)) m.set(k, { rows: [], labels: new Map() });
126 + const g = m.get(k);
127 + g.rows.push(r);
128 + g.labels.set(raw, (g.labels.get(raw) ?? 0) + 1);
129 + }
130 + return [...m.values()]
131 + .filter((g) => g.rows.length >= 30)
132 + .sort((a, b) => b.rows.length - a.rows.length)
133 + .map((g) => ({
134 + key: [...g.labels.entries()].sort((a, b) => b[1] - a[1])[0][0],
135 + ...stats(g.rows),
136 + }));
137 +};
138 +
139 +// histogramme du ratio estimation / prix demandé (pas de 5 %, queues groupées)
140 +const hist = [];
141 +for (let lo = 0.5; lo < 1.5 - 1e-9; lo += 0.05) hist.push({ lo: r4(lo), hi: r4(lo + 0.05), n: 0 });
142 +let below = 0,
143 + above = 0;
144 +for (const r of val) {
145 + const q = r.est / r.price;
146 + if (q < 0.5) below++;
147 + else if (q >= 1.5) above++;
148 + else hist[Math.min(hist.length - 1, Math.floor((q - 0.5) / 0.05))].n++;
149 +}
150 +
151 +// tranches de prix demandé
152 +const brackets = [
153 + [0, 300000, "<300k"],
154 + [300000, 500000, "300-500k"],
155 + [500000, 750000, "500-750k"],
156 + [750000, 1000000, "750k-1M"],
157 + [1000000, Infinity, ">1M"],
158 +].map(([lo, hi, label]) => ({
159 + key: label,
160 + ...stats(val.filter((r) => r.price >= lo && r.price < hi)),
161 +}));
162 +
163 +// nuage prix demandé × estimation (échantillon stable pour le graphique)
164 +const step = Math.max(1, Math.floor(val.length / 1500));
165 +const scatter = val
166 + .filter((_, i) => i % step === 0)
167 + .map((r) => ({ p: Math.round(r.price), e: Math.round(r.est), l: r.lvl }));
168 +
169 +const out = {
170 + generated: new Date().toISOString(),
171 + source: {
172 + app: "Immo-Ka",
173 + copiedAt: at,
174 + totalListings,
175 + matched,
176 + evaluated: rows.length,
177 + valid: val.length,
178 + },
179 + global: stats(val),
180 + byConfidence: ["A", "B", "C", "D"].map((lvl) => ({
181 + key: lvl,
182 + ...stats(val.filter((r) => r.lvl === lvl)),
183 + })),
184 + // type côté annonce (Maison/Condo/…) : plus parlant que le type du rôle —
185 + // beaucoup de condos sont classés « unifamilial » dans le rôle MAMH.
186 + byType: groupBy("property_type", { normalize: true }).slice(0, 10),
187 + byRegion: groupBy("region", { normalize: true })
188 + .filter((g) => !/^\d+$/.test(g.key)) // certaines sources donnent le code de région, pas le nom
189 + .slice(0, 18),
190 + byCity: groupBy("city", { normalize: true }).slice(0, 15),
191 + byBracket: brackets,
192 + histogram: { below, above, bins: hist },
193 + scatter,
194 +};
195 +const dest = path.join(process.cwd(), "src", "data", "marche-stats.json");
196 +writeFileSync(dest, JSON.stringify(out));
197 +console.log(`écrit ${dest} — global :`, out.global);
added scripts/eval-immoka.ts +142 −0
@@ -0,0 +1,142 @@
1 +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai
2 +/**
3 + * scripts/eval-immoka.ts — évalue en lot les annonces actives d'Immo-Ka avec
4 + * le moteur UQO Éval (même chemin que estimateByUnitId, sans le contexte
5 + * marché, inutile pour les agrégats). Les annonces d'Immo-Ka portent déjà
6 + * l'id d'unité du rôle (champ JSON `vraiprix.id` = units.id_provinc).
7 + *
8 + * Sharding par processus (14 cœurs M4M36) :
9 + * SHARDS=8 SHARD=0..7 npx tsx scripts/eval-immoka.ts
10 + * Chaque shard écrit tmp/eval-shards/shard-N.jsonl ; la fusion + les agrégats
11 + * sont faits par scripts/build-marche-stats.mjs.
12 + *
13 + * Env : IMMOKA_DB (défaut data/immoka.db), VRAIPRIX_DB (défaut data/vraiprix.db),
14 + * LIMIT (test), SHARD/SHARDS.
15 + */
16 +import Database from "better-sqlite3";
17 +import fs from "fs";
18 +import path from "path";
19 +import { getCandidates, getMarketIndex, getUnit, type TxRow } from "../src/lib/db";
20 +import { estimate, type CompInput, type Subject } from "../src/lib/engine";
21 +import { indexType } from "../src/lib/estimator";
22 +
23 +const SHARD = Number(process.env.SHARD ?? 0);
24 +const SHARDS = Number(process.env.SHARDS ?? 1);
25 +const LIMIT = Number(process.env.LIMIT ?? 0);
26 +const IMMOKA_DB = process.env.IMMOKA_DB ?? path.join(process.cwd(), "data", "immoka.db");
27 +const OUT_DIR = path.join(process.cwd(), "tmp", "eval-shards");
28 +
29 +// --- répliques des helpers privés d'estimator.ts (même logique exactement) ---
30 +function toComps(rows: TxRow[]): CompInput[] {
31 + return rows.map((r) => ({
32 + id: r.id,
33 + date: r.date,
34 + amount: r.amount,
35 + lat: r.lat,
36 + lng: r.lng,
37 + propertyType: r.property_type,
38 + yearBuilt: r.year_built,
39 + floorArea: r.floor_area,
40 + street: r.street,
41 + city: r.city,
42 + }));
43 +}
44 +function since(months: number): string {
45 + const d = new Date();
46 + d.setMonth(d.getMonth() - months);
47 + return d.toISOString().slice(0, 10);
48 +}
49 +function candidatesAround(lat: number, lng: number): TxRow[] {
50 + for (const halfDeg of [0.02, 0.1]) {
51 + const rows = getCandidates(lat, lng, halfDeg, since(30), 600);
52 + if (rows.length >= 30) return rows;
53 + }
54 + return getCandidates(lat, lng, 0.25, since(36), 600);
55 +}
56 +const nowISO = new Date().toISOString().slice(0, 10);
57 +
58 +// L'indice de marché ne dépend que du type (3 valeurs) — cache évident en lot.
59 +const idxCache = new Map<string, { month: string; idx: number }[]>();
60 +function idxFor(typeProp: string) {
61 + const k = indexType(typeProp);
62 + let v = idxCache.get(k);
63 + if (!v) {
64 + v = getMarketIndex(k);
65 + idxCache.set(k, v);
66 + }
67 + return v;
68 +}
69 +
70 +// --- lecture des annonces (copie immoka.db, lecture seule) ---
71 +const immo = new Database(IMMOKA_DB, { readonly: true, fileMustExist: true });
72 +const rows = immo
73 + .prepare(
74 + `SELECT rowid AS rid, uid, price, vraiprix FROM listings
75 + WHERE status='a-vendre' AND published=1 AND active=1 AND dup_hidden=0
76 + AND price > 0 AND vraiprix IS NOT NULL AND vraiprix != ''
77 + AND (rowid % ?) = ?
78 + ${LIMIT ? "LIMIT " + LIMIT : ""}`
79 + )
80 + .all(SHARDS, SHARD) as { rid: number; uid: string; price: number; vraiprix: string }[];
81 +
82 +fs.mkdirSync(OUT_DIR, { recursive: true });
83 +const outPath = path.join(OUT_DIR, `shard-${SHARD}.jsonl`);
84 +const out = fs.createWriteStream(outPath);
85 +
86 +let done = 0;
87 +let noUnit = 0;
88 +const t0 = Date.now();
89 +for (const r of rows) {
90 + let unitId: string | null = null;
91 + try {
92 + unitId = JSON.parse(r.vraiprix)?.id ?? null;
93 + } catch {
94 + /* JSON invalide → non jumelée */
95 + }
96 + const u = unitId ? getUnit(unitId) : undefined;
97 + if (!u || u.lat == null || u.lng == null) {
98 + noUnit++;
99 + continue;
100 + }
101 + const subject: Subject = {
102 + lat: u.lat,
103 + lng: u.lng,
104 + typeProp: u.type_prop,
105 + floorArea: u.aire_etages_m2,
106 + yearBuilt: u.annee_construction,
107 + landArea: u.superficie_terrain_m2,
108 + modelEstimate: u.est_2026,
109 + modelP10: u.p10,
110 + modelP90: u.p90,
111 + };
112 + const res = estimate(subject, toComps(candidatesAround(u.lat, u.lng)), idxFor(u.type_prop), nowISO);
113 + out.write(
114 + JSON.stringify({
115 + uid: r.uid,
116 + unit_id: u.id_provinc,
117 + price: r.price,
118 + est: res.estimate,
119 + low: res.low,
120 + high: res.high,
121 + cpct: res.confidencePct,
122 + clevel: res.confidenceLevel,
123 + model: res.modelEstimate,
124 + comps: res.compsEstimate,
125 + mw: res.modelWeight,
126 + ncomps: res.nCompsUsed,
127 + role: u.valeur_role,
128 + type: u.type_prop,
129 + muni: u.municipalite,
130 + }) + "\n"
131 + );
132 + done++;
133 + if (done % 1000 === 0) {
134 + const rate = done / ((Date.now() - t0) / 1000);
135 + console.log(`[shard ${SHARD}] ${done}/${rows.length} (${rate.toFixed(0)}/s)`);
136 + }
137 +}
138 +out.end();
139 +console.log(
140 + `[shard ${SHARD}] terminé : ${done} évaluées, ${noUnit} sans unité, ` +
141 + `${((Date.now() - t0) / 1000).toFixed(0)} s → ${outPath}`
142 +);
added scripts/run-eval-shards.sh +9 −0
@@ -0,0 +1,9 @@
1 +#!/bin/zsh -l
2 +cd ~/apps/uqo-eval
3 +rm -f tmp/eval-shards/*.jsonl tmp/eval-shards/log-*.txt
4 +for i in 0 1 2 3 4 5; do
5 + SHARDS=6 SHARD=$i npx tsx scripts/eval-immoka.ts > tmp/eval-shards/log-$i.txt 2>&1 &
6 +done
7 +wait
8 +tail -n1 tmp/eval-shards/log-*.txt
9 +wc -l tmp/eval-shards/*.jsonl
modified src/app/sitemap.ts +1 −0
@@ -16,6 +16,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
16 16 { url: `${SITE_URL}/municipalites`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.9 },
17 17 { url: `${SITE_URL}/carte`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.8 },
18 18 { url: `${SITE_URL}/stats`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.8 },
19 + { url: `${SITE_URL}/stats/marche`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.7 },
19 20 { url: `${SITE_URL}/ka`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.7 },
20 21 { url: `${SITE_URL}/parc`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.6 },
21 22 { url: `${SITE_URL}/methodologie`, lastModified: LASTMOD, changeFrequency: "monthly", priority: 0.7 },
added src/app/stats/marche/page.tsx +20 −0
@@ -0,0 +1,20 @@
1 +// UQO Éval — laboratoire pédagogique d'évaluation immobilière
2 +import MarcheView, { type MarcheStats } from "@/components/MarcheView";
3 +import stats from "@/data/marche-stats.json";
4 +
5 +import type { Metadata } from "next";
6 +
7 +export const metadata: Metadata = {
8 + title: "La mesure à l'épreuve du marché — estimation vs prix demandés",
9 + description:
10 + "Le moteur UQO Éval confronté à ~49 000 annonces réellement à vendre au Québec (base Immo-Ka) : ratio médian estimation/prix demandé, MdAPE, calibration de l'indice de confiance A-D, performance par type, région et tranche de prix.",
11 + alternates: { canonical: "/stats/marche" },
12 +};
13 +
14 +export default function MarchePage() {
15 + return (
16 + <div className="pb-6">
17 + <MarcheView s={stats as unknown as MarcheStats} />
18 + </div>
19 + );
20 +}
modified src/app/stats/page.tsx +7 −0
@@ -1,8 +1,10 @@
1 1 // UQO Éval — laboratoire pédagogique d'évaluation immobilière
2 2 import StatsView, { type ProvStats } from "@/components/StatsView";
3 3 import StatsDashboard, { type DashboardPayload } from "@/components/StatsDashboard";
4 +import MarcheTeaser from "@/components/MarcheTeaser";
4 5 import { getDashboard } from "@/lib/stats-dashboard";
5 6 import stats from "@/data/stats.json";
7 +import marche from "@/data/marche-stats.json";
6 8
7 9 import type { Metadata } from "next";
8 10
@@ -18,6 +20,11 @@ export default function StatsPage() {
18 20 return (
19 21 <div className="pb-6">
20 22 <StatsView s={stats as ProvStats} />
23 + <MarcheTeaser
24 + n={marche.source.valid}
25 + mdape={marche.global.mdape}
26 + ratio={marche.global.medianRatio}
27 + />
21 28 <StatsDashboard initial={dash} />
22 29 </div>
23 30 );
added src/components/MarcheTeaser.tsx +37 −0
@@ -0,0 +1,37 @@
1 +// UQO Éval — laboratoire pédagogique d'évaluation immobilière
2 +/** Bandeau /stats → /stats/marche : la validation externe de la mesure. */
3 +"use client";
4 +import Link from "next/link";
5 +import { useLang } from "./LangContext";
6 +
7 +export default function MarcheTeaser({
8 + n,
9 + mdape,
10 + ratio,
11 +}: {
12 + n: number;
13 + mdape: number;
14 + ratio: number;
15 +}) {
16 + const { lang } = useLang();
17 + const fr = lang === "fr";
18 + const loc = fr ? "fr-CA" : "en-CA";
19 + return (
20 + <section className="mx-auto mt-12 max-w-5xl px-4">
21 + <Link
22 + href="/stats/marche"
23 + className="vp-card vp-card-hover block border-l-4 border-l-[var(--accent)] p-5"
24 + >
25 + <span className="kicker">{fr ? "Nouveau — validation externe" : "New — external validation"}</span>
26 + <h2 className="vp-display mt-2 text-[20px] font-bold uppercase tracking-[-0.02em]">
27 + {fr ? "La mesure à l'épreuve du marché" : "The measure vs. the market"}
28 + </h2>
29 + <p className="mt-2 max-w-3xl text-[13.5px] leading-relaxed text-ink-2">
30 + {fr
31 + ? `Le moteur confronté à ${n.toLocaleString(loc)} annonces réellement à vendre (base Immo-Ka) : ratio médian estimation / prix demandé ${ratio.toLocaleString(loc, { minimumFractionDigits: 3 })}, MdAPE ${(mdape * 100).toLocaleString(loc, { maximumFractionDigits: 1 })} %, et la calibration A-D vérifiée sur le terrain →`
32 + : `The engine tested on ${n.toLocaleString(loc)} properties actually for sale (Immo-Ka data): median estimate/asking ratio ${ratio.toLocaleString(loc, { minimumFractionDigits: 3 })}, ${(mdape * 100).toLocaleString(loc, { maximumFractionDigits: 1 })}% MdAPE, and the A-D calibration verified in the field →`}
33 + </p>
34 + </Link>
35 + </section>
36 + );
37 +}
added src/components/MarcheView.tsx +372 −0
@@ -0,0 +1,372 @@
1 +// UQO Éval — laboratoire pédagogique d'évaluation immobilière
2 +/**
3 + * /stats/marche — la mesure à l'épreuve du marché actif.
4 + * Compare l'estimation UQO Éval au prix demandé de ~49 000 annonces
5 + * réelles (copie de la base Immo-Ka, merge table uqo_eval), et montre —
6 + * démarche pédagogique — ce que l'écart mesure vraiment : l'erreur du
7 + * modèle PLUS la stratégie d'affichage du vendeur.
8 + */
9 +"use client";
10 +import { locNum } from "./MetricViz";
11 +import { useLang } from "./LangContext";
12 +
13 +/* ---------------------------------- types --------------------------------- */
14 +interface Slice {
15 + key: string;
16 + n: number;
17 + medianRatio: number | null;
18 + mdape: number | null;
19 + within10: number | null;
20 + within20: number | null;
21 + askAbove: number | null;
22 + inP10P90: number | null;
23 + medianAsk: number | null;
24 + medianEst: number | null;
25 +}
26 +export interface MarcheStats {
27 + generated: string;
28 + source: {
29 + app: string;
30 + copiedAt: string;
31 + totalListings: number;
32 + matched: number;
33 + evaluated: number;
34 + valid: number;
35 + };
36 + global: Omit<Slice, "key">;
37 + byConfidence: Slice[];
38 + byType: Slice[];
39 + byRegion: Slice[];
40 + byCity: Slice[];
41 + byBracket: Slice[];
42 + histogram: { below: number; above: number; bins: { lo: number; hi: number; n: number }[] };
43 + scatter: { p: number; e: number; l: string }[];
44 +}
45 +
46 +/* -------------------------------- helpers -------------------------------- */
47 +const money = (v: number | null, lang: string) =>
48 + v == null
49 + ? "—"
50 + : new Intl.NumberFormat(lang === "fr" ? "fr-CA" : "en-CA", {
51 + style: "currency",
52 + currency: "CAD",
53 + maximumFractionDigits: 0,
54 + }).format(v);
55 +const pct = (v: number | null, lang: string, frac = 1) =>
56 + v == null ? "—" : `${(v * 100).toLocaleString(lang === "fr" ? "fr-CA" : "en-CA", { maximumFractionDigits: frac })} %`;
57 +
58 +function SectionTitle({ kicker, title }: { kicker: string; title: string }) {
59 + return (
60 + <div className="mb-4 mt-12">
61 + <span className="kicker">{kicker}</span>
62 + <h2 className="vp-display mt-2 text-[22px] font-bold uppercase tracking-[-0.02em]">{title}</h2>
63 + </div>
64 + );
65 +}
66 +
67 +function Kpi({ label, value, hint }: { label: string; value: string; hint?: string }) {
68 + return (
69 + <div className="vp-card p-4">
70 + <div className="text-[11px] uppercase tracking-[0.08em] text-ink-3">{label}</div>
71 + <div className="vp-display mt-1 text-[26px] font-bold leading-none">{value}</div>
72 + {hint ? <div className="mt-2 text-[12px] leading-snug text-ink-2">{hint}</div> : null}
73 + </div>
74 + );
75 +}
76 +
77 +/* ------------------------- histogramme du ratio ------------------------- */
78 +function RatioHistogram({ s, fr }: { s: MarcheStats; fr: boolean }) {
79 + const bins = [
80 + { lo: 0, hi: 0.5, n: s.histogram.below },
81 + ...s.histogram.bins,
82 + { lo: 1.5, hi: Infinity, n: s.histogram.above },
83 + ];
84 + const max = Math.max(...bins.map((b) => b.n));
85 + const W = 720;
86 + const H = 210;
87 + const pad = { l: 8, r: 8, t: 14, b: 26 };
88 + const bw = (W - pad.l - pad.r) / bins.length;
89 + // repère x du ratio 1,0 : frontière entre les bacs 0,95-1,00 et 1,00-1,05
90 + const oneIdx = 1 + s.histogram.bins.findIndex((b) => Math.abs(b.lo - 1) < 1e-9);
91 + const oneX = pad.l + oneIdx * bw;
92 + return (
93 + <svg viewBox={`0 0 ${W} ${H}`} className="w-full" role="img"
94 + aria-label={fr ? "Distribution du ratio estimation / prix demandé" : "Distribution of estimate / asking price ratio"}>
95 + {bins.map((b, i) => {
96 + const h = max ? ((H - pad.t - pad.b) * b.n) / max : 0;
97 + const near1 = b.lo >= 0.9 - 1e-9 && b.hi <= 1.1 + 1e-9;
98 + return (
99 + <rect key={i} x={pad.l + i * bw + 1} y={H - pad.b - h} width={bw - 2} height={h}
100 + fill={near1 ? "var(--accent)" : "var(--ink-3)"} opacity={near1 ? 1 : 0.55} />
101 + );
102 + })}
103 + <line x1={oneX} y1={pad.t - 6} x2={oneX} y2={H - pad.b} stroke="var(--ink)" strokeDasharray="3 3" />
104 + <text x={oneX + 5} y={pad.t + 4} fontSize="11" fill="var(--ink)" fontFamily="var(--font-mono)">
105 + 1,0 — {fr ? "estimation = prix demandé" : "estimate = asking price"}
106 + </text>
107 + {[0.5, 0.75, 1.0, 1.25, 1.5].map((v) => {
108 + const idx = 1 + (v - 0.5) / 0.05; // frontières des bacs intérieurs
109 + return (
110 + <text key={v} x={pad.l + idx * bw} y={H - 8} fontSize="10" textAnchor="middle" fill="var(--ink-3)"
111 + fontFamily="var(--font-mono)">
112 + {v.toLocaleString(fr ? "fr-CA" : "en-CA")}
113 + </text>
114 + );
115 + })}
116 + </svg>
117 + );
118 +}
119 +
120 +/* --------------------- nuage prix demandé × estimation -------------------- */
121 +function AskScatter({ s, fr }: { s: MarcheStats; fr: boolean }) {
122 + const CAP = 1_500_000;
123 + const pts = s.scatter.filter((d) => d.p <= CAP && d.e <= CAP);
124 + const W = 360;
125 + const H = 360;
126 + const pad = 34;
127 + const sc = (v: number) => pad + ((W - 2 * pad) * v) / CAP;
128 + return (
129 + <svg viewBox={`0 0 ${W} ${H}`} className="w-full max-w-[420px]" role="img"
130 + aria-label={fr ? "Nuage prix demandé vs estimation" : "Asking price vs estimate scatter"}>
131 + {[500000, 1000000, 1500000].map((v) => (
132 + <g key={v}>
133 + <line x1={sc(v)} y1={H - pad} x2={sc(v)} y2={pad} stroke="var(--line-soft)" />
134 + <line x1={pad} y1={H - sc(v)} x2={W - pad} y2={H - sc(v)} stroke="var(--line-soft)" />
135 + <text x={sc(v)} y={H - pad + 14} fontSize="9" textAnchor="middle" fill="var(--ink-3)" fontFamily="var(--font-mono)">
136 + {v / 1000000 >= 1 ? `${v / 1000000}M` : `${v / 1000}k`}
137 + </text>
138 + <text x={pad - 6} y={H - sc(v) + 3} fontSize="9" textAnchor="end" fill="var(--ink-3)" fontFamily="var(--font-mono)">
139 + {v / 1000000 >= 1 ? `${v / 1000000}M` : `${v / 1000}k`}
140 + </text>
141 + </g>
142 + ))}
143 + <line x1={sc(0)} y1={H - sc(0)} x2={sc(CAP)} y2={H - sc(CAP)} stroke="var(--ink)" strokeDasharray="4 3" />
144 + {pts.map((d, i) => (
145 + <circle key={i} cx={sc(d.p)} cy={H - sc(d.e)} r={1.6}
146 + fill={d.l === "A" ? "var(--accent)" : d.l === "B" ? "var(--accent-bright)" : "var(--ink-3)"} opacity={0.5} />
147 + ))}
148 + <text x={W / 2} y={H - 4} fontSize="10" textAnchor="middle" fill="var(--ink-2)">
149 + {fr ? "Prix demandé" : "Asking price"}
150 + </text>
151 + <text x={10} y={H / 2} fontSize="10" textAnchor="middle" fill="var(--ink-2)" transform={`rotate(-90 10 ${H / 2})`}>
152 + {fr ? "Estimation UQO Éval" : "UQO Éval estimate"}
153 + </text>
154 + </svg>
155 + );
156 +}
157 +
158 +/* ------------------------------ tableau générique ------------------------------ */
159 +function SliceTable({ rows, label, fr, keyHeader }: { rows: Slice[]; label?: string; fr: boolean; keyHeader: string }) {
160 + return (
161 + <div className="vp-card overflow-x-auto p-0">
162 + {label ? <div className="border-b border-[var(--line)] px-4 py-2 text-[12px] font-semibold uppercase tracking-[0.06em]">{label}</div> : null}
163 + <table className="w-full text-[13px]">
164 + <thead>
165 + <tr className="border-b border-[var(--line)] text-left text-[11px] uppercase tracking-[0.06em] text-ink-3">
166 + <th className="px-4 py-2">{keyHeader}</th>
167 + <th className="px-2 py-2 text-right">n</th>
168 + <th className="px-2 py-2 text-right">{fr ? "Ratio méd." : "Med. ratio"}</th>
169 + <th className="px-2 py-2 text-right">MdAPE</th>
170 + <th className="px-2 py-2 text-right">±20 %</th>
171 + <th className="px-4 py-2 text-right">{fr ? "Prix méd." : "Med. ask"}</th>
172 + </tr>
173 + </thead>
174 + <tbody>
175 + {rows.map((r) => (
176 + <tr key={r.key} className="border-b border-[var(--line-soft)] last:border-0">
177 + <td className="px-4 py-1.5 font-medium">{r.key}</td>
178 + <td className="px-2 py-1.5 text-right font-mono text-[12px]">{locNum(r.n, fr ? "fr" : "en", { maxFrac: 0 })}</td>
179 + <td className="px-2 py-1.5 text-right font-mono text-[12px]">
180 + {r.medianRatio == null ? "—" : r.medianRatio.toLocaleString(fr ? "fr-CA" : "en-CA", { minimumFractionDigits: 3, maximumFractionDigits: 3 })}
181 + </td>
182 + <td className="px-2 py-1.5 text-right font-mono text-[12px]">{pct(r.mdape, fr ? "fr" : "en")}</td>
183 + <td className="px-2 py-1.5 text-right font-mono text-[12px]">{pct(r.within20, fr ? "fr" : "en", 0)}</td>
184 + <td className="px-4 py-1.5 text-right font-mono text-[12px]">{money(r.medianAsk, fr ? "fr" : "en")}</td>
185 + </tr>
186 + ))}
187 + </tbody>
188 + </table>
189 + </div>
190 + );
191 +}
192 +
193 +/* ---------------------------------- vue ---------------------------------- */
194 +export default function MarcheView({ s }: { s: MarcheStats }) {
195 + const { lang } = useLang();
196 + const fr = lang === "fr";
197 + const g = s.global;
198 + const copied = new Date(s.source.copiedAt + "T12:00:00").toLocaleDateString(fr ? "fr-CA" : "en-CA", {
199 + year: "numeric", month: "long", day: "numeric",
200 + });
201 +
202 + return (
203 + <div className="mx-auto max-w-5xl px-4 pt-10 sm:pt-14">
204 + {/* ---- manchette ---- */}
205 + <section>
206 + <span className="kicker">{fr ? "Validation externe" : "External validation"}</span>
207 + <h1 className="vp-display mt-3 text-[clamp(26px,4.6vw,46px)] font-bold uppercase leading-[1.02] tracking-[-0.03em]">
208 + {fr ? "La mesure à l'épreuve du marché" : "The measure vs. the market"}
209 + </h1>
210 + <p className="mt-4 max-w-3xl text-[15px] leading-relaxed text-ink-2">
211 + {fr ? (
212 + <>
213 + Nous avons évalué avec le moteur UQO Éval{" "}
214 + <b>{locNum(s.source.evaluated, "fr", { maxFrac: 0 })} annonces réellement à vendre</b> au Québec
215 + (base de l&apos;agrégateur Immo-Ka, copiée le {copied}) et comparé chaque estimation au{" "}
216 + <b>prix demandé</b> par le vendeur. C&apos;est un test grandeur nature — et une leçon d&apos;évaluation :
217 + l&apos;écart observé mélange l&apos;erreur du modèle <i>et</i> la stratégie d&apos;affichage.
218 + </>
219 + ) : (
220 + <>
221 + We ran the UQO Éval engine on{" "}
222 + <b>{locNum(s.source.evaluated, "en", { maxFrac: 0 })} properties actually for sale</b> in Québec
223 + (Immo-Ka aggregator database, copied on {copied}) and compared each estimate to the seller&apos;s{" "}
224 + <b>asking price</b>. A full-scale test — and an appraisal lesson: the observed gap mixes model
225 + error <i>and</i> pricing strategy.
226 + </>
227 + )}
228 + </p>
229 + <div className="mt-8 grid grid-cols-1 gap-3 sm:grid-cols-3">
230 + <Kpi
231 + label={fr ? "Annonces évaluées" : "Listings appraised"}
232 + value={locNum(s.source.valid, fr ? "fr" : "en", { maxFrac: 0 })}
233 + hint={fr ? `sur ${locNum(s.source.totalListings, "fr", { maxFrac: 0 })} annonces actives publiées` : `of ${locNum(s.source.totalListings, "en", { maxFrac: 0 })} active published listings`}
234 + />
235 + <Kpi
236 + label={fr ? "Ratio médian estimation / prix demandé" : "Median estimate / asking ratio"}
237 + value={g.medianRatio == null ? "—" : g.medianRatio.toLocaleString(fr ? "fr-CA" : "en-CA", { minimumFractionDigits: 3 })}
238 + hint={fr ? "les vendeurs affichent en médiane ≈ 6 % au-dessus de notre estimation" : "sellers list a median ≈ 6% above our estimate"}
239 + />
240 + <Kpi
241 + label={fr ? "Prix demandés dans P10-P90" : "Asking prices within P10-P90"}
242 + value={pct(g.inP10P90, fr ? "fr" : "en")}
243 + hint={fr ? "part des prix demandés couverts par notre intervalle de confiance" : "share of asking prices covered by our confidence interval"}
244 + />
245 + </div>
246 + </section>
247 +
248 + {/* ---- avertissement pédagogique ---- */}
249 + <div className="vp-card mt-8 border-l-4 border-l-[var(--accent)] p-4 text-[13.5px] leading-relaxed text-ink-2">
250 + {fr ? (
251 + <>
252 + <b className="text-ink">🎓 Prix demandé ≠ valeur marchande.</b> Le moteur est calibré sur des{" "}
253 + <b>transactions réelles</b> (MdAPE 11,0 % contre les prix de vente). Face aux prix <i>demandés</i>, l&apos;écart
254 + médian monte à {pct(g.mdape, "fr")} : la différence contient la marge de négociation, la surenchère
255 + d&apos;affichage et les propriétés atypiques — pas seulement l&apos;erreur du modèle.{" "}
256 + {pct(g.askAbove, "fr", 0)} des annonces sont affichées <b>au-dessus</b> de notre estimation, un biais
257 + attendu et documenté en évaluation.
258 + </>
259 + ) : (
260 + <>
261 + <b className="text-ink">🎓 Asking price ≠ market value.</b> The engine is calibrated on{" "}
262 + <b>real transactions</b> (11.0% MdAPE against sale prices). Against <i>asking</i> prices the median gap
263 + rises to {pct(g.mdape, "en")}: the difference contains negotiation margin, listing premium and atypical
264 + properties — not just model error. {pct(g.askAbove, "en", 0)} of listings are priced <b>above</b> our
265 + estimate, an expected and well-documented bias.
266 + </>
267 + )}
268 + </div>
269 +
270 + {/* ---- indicateurs ---- */}
271 + <SectionTitle kicker={fr ? "Indicateurs" : "Indicators"} title={fr ? "Performance globale" : "Overall performance"} />
272 + <div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
273 + <Kpi label={fr ? "MdAPE vs prix demandé" : "MdAPE vs asking"} value={pct(g.mdape, fr ? "fr" : "en")} />
274 + <Kpi label={fr ? "Écart ≤ 10 %" : "Within 10%"} value={pct(g.within10, fr ? "fr" : "en")} />
275 + <Kpi label={fr ? "Écart ≤ 20 %" : "Within 20%"} value={pct(g.within20, fr ? "fr" : "en")} />
276 + <Kpi label={fr ? "Affichées au-dessus de l'estimation" : "Listed above estimate"} value={pct(g.askAbove, fr ? "fr" : "en")} />
277 + <Kpi label={fr ? "Prix demandé médian" : "Median asking price"} value={money(g.medianAsk, fr ? "fr" : "en")} />
278 + <Kpi label={fr ? "Estimation médiane" : "Median estimate"} value={money(g.medianEst, fr ? "fr" : "en")} />
279 + </div>
280 +
281 + {/* ---- distribution ---- */}
282 + <SectionTitle kicker={fr ? "Distribution" : "Distribution"} title={fr ? "Ratio estimation / prix demandé" : "Estimate / asking price ratio"} />
283 + <div className="vp-card p-4">
284 + <RatioHistogram s={s} fr={fr} />
285 + <p className="mt-2 text-[12.5px] text-ink-2">
286 + {fr
287 + ? "En bleu : annonces où l'estimation est à ±10 % du prix demandé. La masse à gauche de 1,0 = vendeurs qui demandent plus que notre valeur estimée."
288 + : "Blue: listings where the estimate is within ±10% of asking. Mass left of 1.0 = sellers asking more than our estimated value."}
289 + </p>
290 + </div>
291 +
292 + {/* ---- nuage + confiance ---- */}
293 + <div className="mt-8 grid grid-cols-1 gap-4 lg:grid-cols-2">
294 + <div className="vp-card p-4">
295 + <div className="mb-2 text-[12px] font-semibold uppercase tracking-[0.06em]">
296 + {fr ? "Prix demandé × estimation (échantillon)" : "Asking × estimate (sample)"}
297 + </div>
298 + <AskScatter s={s} fr={fr} />
299 + <p className="mt-1 text-[12px] text-ink-2">
300 + {fr
301 + ? "Diagonale = accord parfait. Bleu foncé : confiance A · turquoise : B · gris : C-D."
302 + : "Diagonal = perfect agreement. Dark blue: confidence A · turquoise: B · grey: C-D."}
303 + </p>
304 + </div>
305 + <div>
306 + <SliceTable
307 + rows={s.byConfidence.filter((r) => r.n > 0)}
308 + fr={fr}
309 + keyHeader={fr ? "Indice de confiance" : "Confidence index"}
310 + label={fr ? "L'indice de confiance tient sa promesse" : "The confidence index keeps its promise"}
311 + />
312 + <p className="mt-2 px-1 text-[12.5px] leading-relaxed text-ink-2">
313 + {fr
314 + ? "Point pédagogique clé : l'erreur croît exactement comme l'indice l'annonce — de "
315 + : "Key teaching point: error grows exactly as the index predicts — from "}
316 + {pct(s.byConfidence[0]?.mdape ?? null, fr ? "fr" : "en")} (A){fr ? " à " : " to "}
317 + {pct(s.byConfidence[2]?.mdape ?? null, fr ? "fr" : "en")} (C).{" "}
318 + {fr
319 + ? "En confiance A, le ratio médian est de 1,000 : aucune sur- ni sous-évaluation systématique."
320 + : "At confidence A the median ratio is 1.000: no systematic over- or under-valuation."}
321 + </p>
322 + </div>
323 + </div>
324 +
325 + {/* ---- segments ---- */}
326 + <SectionTitle kicker={fr ? "Segments" : "Segments"} title={fr ? "Où la mesure excelle — et où elle peine" : "Where the measure excels — and struggles"} />
327 + <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
328 + <SliceTable rows={s.byType} fr={fr} keyHeader={fr ? "Type d'annonce" : "Listing type"} label={fr ? "Par type de propriété" : "By property type"} />
329 + <SliceTable rows={s.byBracket} fr={fr} keyHeader={fr ? "Tranche de prix" : "Price bracket"} label={fr ? "Par tranche de prix demandé" : "By asking price bracket"} />
330 + <SliceTable rows={s.byRegion} fr={fr} keyHeader={fr ? "Région" : "Region"} label={fr ? "Par région" : "By region"} />
331 + <SliceTable rows={s.byCity} fr={fr} keyHeader={fr ? "Ville" : "City"} label={fr ? "Principales villes" : "Top cities"} />
332 + </div>
333 +
334 + {/* ---- méthode ---- */}
335 + <SectionTitle kicker={fr ? "Méthode" : "Method"} title={fr ? "D'où viennent ces chiffres" : "Where these numbers come from"} />
336 + <div className="vp-card p-4 text-[13.5px] leading-relaxed text-ink-2">
337 + {fr ? (
338 + <>
339 + Copie intégrale de la base d&apos;annonces <b>Immo-Ka</b> ({copied}) :{" "}
340 + {locNum(s.source.totalListings, "fr", { maxFrac: 0 })} annonces actives publiées, dont{" "}
341 + {locNum(s.source.matched, "fr", { maxFrac: 0 })} déjà jumelées à une unité du rôle d&apos;évaluation MAMH.{" "}
342 + {locNum(s.source.evaluated, "fr", { maxFrac: 0 })} ont pu être évaluées par le moteur (le reste :
343 + unités d&apos;un millésime plus récent que notre copie du rôle) ; l&apos;analyse retient les{" "}
344 + {locNum(s.source.valid, "fr", { maxFrac: 0 })} annonces à prix demandé ≥ 50 000 $ — le même seuil que
345 + les ventes retenues par le moteur. Le merge complet annonce ↔ estimation est conservé dans la table{" "}
346 + <code className="font-mono text-[12px]">uqo_eval</code> et chaque annonce passe par{" "}
347 + <i>exactement le même calcul</i> que le formulaire public : modèle hédonique + comparables ajustés,
348 + pondération 65 / 35. Ratio médian et MdAPE sont des médianes — robustes aux annonces extrêmes.
349 + </>
350 + ) : (
351 + <>
352 + Full copy of the <b>Immo-Ka</b> listings database ({copied}):{" "}
353 + {locNum(s.source.totalListings, "en", { maxFrac: 0 })} active published listings,{" "}
354 + {locNum(s.source.matched, "en", { maxFrac: 0 })} already matched to an MAMH assessment-roll unit.{" "}
355 + {locNum(s.source.evaluated, "en", { maxFrac: 0 })} could be appraised by the engine (the rest: units
356 + from a roll vintage newer than our copy); the analysis keeps the{" "}
357 + {locNum(s.source.valid, "en", { maxFrac: 0 })} listings asking ≥ $50,000 — the same floor as the sales
358 + the engine uses. The full listing ↔ estimate merge lives in the{" "}
359 + <code className="font-mono text-[12px]">uqo_eval</code> table, and every listing goes through{" "}
360 + <i>exactly the same computation</i> as the public form: hedonic model + adjusted comparables, 65/35
361 + weighting. Median ratio and MdAPE are medians — robust to extreme listings.
362 + </>
363 + )}
364 + </div>
365 + <p className="mb-4 mt-6 text-[11.5px] text-ink-3">
366 + {fr
367 + ? `Généré le ${new Date(s.generated).toLocaleDateString("fr-CA")} · données Immo-Ka + rôles MAMH · à vocation pédagogique.`
368 + : `Generated ${new Date(s.generated).toLocaleDateString("en-CA")} · Immo-Ka data + MAMH rolls · for teaching purposes.`}
369 + </p>
370 + </div>
371 + );
372 +}
added src/data/marche-stats.json +1 −0
@@ -0,0 +1 @@
1 +{"generated":"2026-08-29T03:29:08.330Z","source":{"app":"Immo-Ka","copiedAt":"2026-08-29","totalListings":70775,"matched":61463,"evaluated":49111,"valid":48728},"global":{"n":48728,"medianRatio":0.9384,"mdape":0.1907,"within10":0.2945,"within20":0.5183,"askAbove":0.6024,"inP10P90":0.6275,"medianAsk":549800,"medianEst":515700},"byConfidence":[{"key":"A","n":14090,"medianRatio":0.9999,"mdape":0.1156,"within10":0.4505,"within20":0.7089,"askAbove":0.5,"inP10P90":0.6452,"medianAsk":549900,"medianEst":550900},{"key":"B","n":16087,"medianRatio":0.9302,"mdape":0.1748,"within10":0.303,"within20":0.5571,"askAbove":0.6224,"inP10P90":0.6218,"medianAsk":575900,"medianEst":533700},{"key":"C","n":9985,"medianRatio":0.8522,"mdape":0.257,"within10":0.2003,"within20":0.3994,"askAbove":0.6767,"inP10P90":0.6128,"medianAsk":569000,"medianEst":479900},{"key":"D","n":8566,"medianRatio":0.8177,"mdape":0.3866,"within10":0.1317,"within20":0.2706,"askAbove":0.6464,"inP10P90":0.6262,"medianAsk":469000,"medianEst":372300}],"byType":[{"key":"Maison","n":27455,"medianRatio":0.914,"mdape":0.1478,"within10":0.3642,"within20":0.6174,"askAbove":0.685,"inP10P90":0.6806,"medianAsk":574900,"medianEst":511900},{"key":"Condo","n":9156,"medianRatio":1.1745,"mdape":0.2601,"within10":0.1997,"within20":0.3933,"askAbove":0.2858,"inP10P90":0.5715,"medianAsk":425000,"medianEst":486700},{"key":"Terrain","n":2506,"medianRatio":1.0963,"mdape":0.5326,"within10":0.1065,"within20":0.2127,"askAbove":0.4413,"inP10P90":0.4836,"medianAsk":242095,"medianEst":323600},{"key":"Commercial","n":2457,"medianRatio":0.6737,"mdape":0.4455,"within10":0.1111,"within20":0.2247,"askAbove":0.7395,"inP10P90":0.394,"medianAsk":849000,"medianEst":603200},{"key":"Duplex","n":1941,"medianRatio":0.9387,"mdape":0.1455,"within10":0.3421,"within20":0.6445,"askAbove":0.6172,"inP10P90":0.798,"medianAsk":599000,"medianEst":544500},{"key":"Triplex","n":1232,"medianRatio":0.9097,"mdape":0.1664,"within10":0.3231,"within20":0.5852,"askAbove":0.6745,"inP10P90":0.7062,"medianAsk":888500,"medianEst":779650},{"key":"Multiplex","n":1047,"medianRatio":0.7743,"mdape":0.2553,"within10":0.1872,"within20":0.4002,"askAbove":0.7908,"inP10P90":0.5482,"medianAsk":1150000,"medianEst":836400},{"key":"Propriétés résidentielles","n":937,"medianRatio":0.8261,"mdape":0.3343,"within10":0.1569,"within20":0.3244,"askAbove":0.6948,"inP10P90":0.444,"medianAsk":1179000,"medianEst":891200},{"key":"Fermette/Agricole","n":654,"medianRatio":0.5962,"mdape":0.4095,"within10":0.0856,"within20":0.2049,"askAbove":0.9327,"inP10P90":0.3211,"medianAsk":949000,"medianEst":546600},{"key":"Jumelé","n":355,"medianRatio":0.961,"mdape":0.0665,"within10":0.6479,"within20":0.8592,"askAbove":0.6732,"inP10P90":0.7662,"medianAsk":495000,"medianEst":468000}],"byRegion":[{"key":"Montreal","n":4345,"medianRatio":1.0532,"mdape":0.2494,"within10":0.2368,"within20":0.4283,"askAbove":0.4389,"inP10P90":0.571,"medianAsk":599000,"medianEst":707800},{"key":"Laurentides","n":3332,"medianRatio":0.9021,"mdape":0.1856,"within10":0.313,"within20":0.5294,"askAbove":0.6843,"inP10P90":0.6252,"medianAsk":599900,"medianEst":531100},{"key":"Monteregie","n":2210,"medianRatio":0.9298,"mdape":0.1537,"within10":0.3683,"within20":0.6,"askAbove":0.6529,"inP10P90":0.6765,"medianAsk":599900,"medianEst":542700},{"key":"Outaouais","n":2174,"medianRatio":0.9579,"mdape":0.1445,"within10":0.3868,"within20":0.6053,"askAbove":0.5874,"inP10P90":0.6881,"medianAsk":499800,"medianEst":456150},{"key":"Lanaudiere","n":2093,"medianRatio":0.9206,"mdape":0.1481,"within10":0.3741,"within20":0.6302,"askAbove":0.6703,"inP10P90":0.6823,"medianAsk":574900,"medianEst":510700},{"key":"Estrie","n":1712,"medianRatio":0.866,"mdape":0.1848,"within10":0.2827,"within20":0.5391,"askAbove":0.7447,"inP10P90":0.639,"medianAsk":580000,"medianEst":476000},{"key":"Laval Rive Nord","n":1305,"medianRatio":0.9813,"mdape":0.1239,"within10":0.4215,"within20":0.682,"askAbove":0.5533,"inP10P90":0.6943,"medianAsk":629000,"medianEst":602200},{"key":"Chaudiere Appalaches","n":1194,"medianRatio":0.8619,"mdape":0.2088,"within10":0.2638,"within20":0.4841,"askAbove":0.7236,"inP10P90":0.6022,"medianAsk":379000,"medianEst":316100},{"key":"Region De Quebec","n":929,"medianRatio":0.9719,"mdape":0.1746,"within10":0.3079,"within20":0.564,"askAbove":0.5554,"inP10P90":0.648,"medianAsk":469000,"medianEst":460700},{"key":"Mauricie","n":921,"medianRatio":0.8711,"mdape":0.1834,"within10":0.2758,"within20":0.5407,"askAbove":0.7329,"inP10P90":0.645,"medianAsk":424900,"medianEst":369100},{"key":"Montérégie Rive Sud Montréal","n":859,"medianRatio":0.9444,"mdape":0.1518,"within10":0.3469,"within20":0.6182,"askAbove":0.6135,"inP10P90":0.6275,"medianAsk":625000,"medianEst":565600},{"key":"Rive Sud De Montreal","n":819,"medianRatio":0.9436,"mdape":0.103,"within10":0.4884,"within20":0.7631,"askAbove":0.6508,"inP10P90":0.7241,"medianAsk":699900,"medianEst":649900},{"key":"Centre Du Quebec","n":810,"medianRatio":0.8846,"mdape":0.1456,"within10":0.3568,"within20":0.6198,"askAbove":0.7617,"inP10P90":0.6691,"medianAsk":449000,"medianEst":391500},{"key":"Saguenay Lac Saint Jean","n":753,"medianRatio":0.8863,"mdape":0.1754,"within10":0.3147,"within20":0.5591,"askAbove":0.7118,"inP10P90":0.656,"medianAsk":389000,"medianEst":352100},{"key":"Bas Saint Laurent","n":524,"medianRatio":0.8577,"mdape":0.2317,"within10":0.2576,"within20":0.4389,"askAbove":0.7252,"inP10P90":0.6088,"medianAsk":352000,"medianEst":290750},{"key":"Québec","n":457,"medianRatio":0.9414,"mdape":0.1211,"within10":0.4267,"within20":0.6696,"askAbove":0.6083,"inP10P90":0.7112,"medianAsk":584000,"medianEst":543300},{"key":"Québec Rive Nord","n":429,"medianRatio":0.9791,"mdape":0.174,"within10":0.3287,"within20":0.5711,"askAbove":0.5291,"inP10P90":0.6224,"medianAsk":525000,"medianEst":480800},{"key":"Gaspesie Iles De La Madeleine","n":308,"medianRatio":0.799,"mdape":0.2429,"within10":0.1818,"within20":0.4058,"askAbove":0.7825,"inP10P90":0.5974,"medianAsk":319000,"medianEst":242350}],"byCity":[{"key":"Montréal","n":5311,"medianRatio":1.0496,"mdape":0.2569,"within10":0.235,"within20":0.4189,"askAbove":0.4393,"inP10P90":0.5927,"medianAsk":650000,"medianEst":760200},{"key":"Québec","n":1162,"medianRatio":1.0218,"mdape":0.1745,"within10":0.3133,"within20":0.5568,"askAbove":0.463,"inP10P90":0.6437,"medianAsk":459800,"medianEst":479000},{"key":"Laval","n":1139,"medianRatio":0.9574,"mdape":0.141,"within10":0.3889,"within20":0.6383,"askAbove":0.5882,"inP10P90":0.6514,"medianAsk":649900,"medianEst":607300},{"key":"Gatineau","n":857,"medianRatio":1.0249,"mdape":0.1252,"within10":0.4236,"within20":0.6569,"askAbove":0.4317,"inP10P90":0.7048,"medianAsk":469900,"medianEst":473500},{"key":"Longueuil","n":611,"medianRatio":1.0194,"mdape":0.168,"within10":0.3339,"within20":0.5728,"askAbove":0.4681,"inP10P90":0.6678,"medianAsk":575000,"medianEst":561900},{"key":"Sherbrooke","n":485,"medianRatio":0.9003,"mdape":0.1597,"within10":0.3155,"within20":0.6,"askAbove":0.701,"inP10P90":0.6928,"medianAsk":549000,"medianEst":480800},{"key":"Lévis","n":444,"medianRatio":0.9388,"mdape":0.1739,"within10":0.3333,"within20":0.5698,"askAbove":0.6306,"inP10P90":0.6734,"medianAsk":479700,"medianEst":450200},{"key":"Saint-Jérôme","n":435,"medianRatio":0.9681,"mdape":0.1414,"within10":0.3862,"within20":0.5931,"askAbove":0.577,"inP10P90":0.6299,"medianAsk":574900,"medianEst":530300},{"key":"Trois-Rivières","n":431,"medianRatio":0.915,"mdape":0.1589,"within10":0.3202,"within20":0.5916,"askAbove":0.645,"inP10P90":0.6775,"medianAsk":475000,"medianEst":438000},{"key":"Drummondville","n":394,"medianRatio":0.9027,"mdape":0.1391,"within10":0.3807,"within20":0.6777,"askAbove":0.7234,"inP10P90":0.7259,"medianAsk":519000,"medianEst":457700},{"key":"Terrebonne","n":392,"medianRatio":0.9511,"mdape":0.1184,"within10":0.4541,"within20":0.7015,"askAbove":0.6301,"inP10P90":0.7423,"medianAsk":649850,"medianEst":604750},{"key":"Brossard","n":353,"medianRatio":1.0209,"mdape":0.1401,"within10":0.3739,"within20":0.5921,"askAbove":0.4504,"inP10P90":0.7025,"medianAsk":598000,"medianEst":591800},{"key":"Granby","n":333,"medianRatio":0.92,"mdape":0.1624,"within10":0.3363,"within20":0.5856,"askAbove":0.6577,"inP10P90":0.6486,"medianAsk":510130,"medianEst":448400},{"key":"Saguenay","n":326,"medianRatio":0.9292,"mdape":0.1514,"within10":0.3834,"within20":0.6442,"askAbove":0.6411,"inP10P90":0.7301,"medianAsk":397750,"medianEst":377450},{"key":"Mirabel","n":314,"medianRatio":0.9553,"mdape":0.1269,"within10":0.4268,"within20":0.7006,"askAbove":0.6274,"inP10P90":0.7134,"medianAsk":684900,"medianEst":626250}],"byBracket":[{"key":"<300k","n":7343,"medianRatio":1.214,"mdape":0.2951,"within10":0.1913,"within20":0.3655,"askAbove":0.2912,"inP10P90":0.6427,"medianAsk":229000,"medianEst":272400},{"key":"300-500k","n":14476,"medianRatio":1.0282,"mdape":0.1605,"within10":0.3379,"within20":0.5873,"askAbove":0.4468,"inP10P90":0.7213,"medianAsk":399900,"medianEst":420400},{"key":"500-750k","n":12451,"medianRatio":0.9179,"mdape":0.1373,"within10":0.3902,"within20":0.6355,"askAbove":0.6923,"inP10P90":0.6894,"medianAsk":610000,"medianEst":558700},{"key":"750k-1M","n":6476,"medianRatio":0.8606,"mdape":0.1741,"within10":0.3033,"within20":0.5565,"askAbove":0.7758,"inP10P90":0.5669,"medianAsk":855000,"medianEst":736400},{"key":">1M","n":7982,"medianRatio":0.6832,"mdape":0.333,"within10":0.154,"within20":0.3201,"askAbove":0.8898,"inP10P90":0.396,"medianAsk":1499000,"medianEst":1025400}],"histogram":{"below":3864,"above":4322,"bins":[{"lo":0.5,"hi":0.55,"n":953},{"lo":0.55,"hi":0.6,"n":1196},{"lo":0.6,"hi":0.65,"n":1488},{"lo":0.65,"hi":0.7,"n":1732},{"lo":0.7,"hi":0.75,"n":2223},{"lo":0.75,"hi":0.8,"n":2711},{"lo":0.8,"hi":0.85,"n":3366},{"lo":0.85,"hi":0.9,"n":3722},{"lo":0.9,"hi":0.95,"n":4138},{"lo":0.95,"hi":1,"n":3959},{"lo":1,"hi":1.05,"n":3541},{"lo":1.05,"hi":1.1,"n":2710},{"lo":1.1,"hi":1.15,"n":2112},{"lo":1.15,"hi":1.2,"n":1709},{"lo":1.2,"hi":1.25,"n":1357},{"lo":1.25,"hi":1.3,"n":1109},{"lo":1.3,"hi":1.35,"n":891},{"lo":1.35,"hi":1.4,"n":695},{"lo":1.4,"hi":1.45,"n":532},{"lo":1.45,"hi":1.5,"n":398}]},"scatter":[{"p":446800,"e":520300,"l":"A"},{"p":699000,"e":536400,"l":"A"},{"p":199995,"e":158400,"l":"D"},{"p":150100,"e":432600,"l":"C"},{"p":199000,"e":165700,"l":"D"},{"p":749900,"e":680300,"l":"C"},{"p":119999,"e":160200,"l":"D"},{"p":559000,"e":426700,"l":"B"},{"p":220000,"e":339900,"l":"A"},{"p":735000,"e":623500,"l":"C"},{"p":349000,"e":152300,"l":"B"},{"p":229700,"e":125500,"l":"C"},{"p":888888,"e":456300,"l":"D"},{"p":229000,"e":215300,"l":"B"},{"p":319000,"e":245200,"l":"B"},{"p":259000,"e":223000,"l":"D"},{"p":3300000,"e":423400,"l":"C"},{"p":85000,"e":171600,"l":"D"},{"p":159000,"e":309800,"l":"D"},{"p":369000,"e":135900,"l":"D"},{"p":125000,"e":130000,"l":"D"},{"p":299000,"e":75100,"l":"D"},{"p":499900,"e":501200,"l":"A"},{"p":324500,"e":334600,"l":"D"},{"p":2500000,"e":300700,"l":"B"},{"p":1370000,"e":720300,"l":"B"},{"p":333900,"e":288300,"l":"B"},{"p":230000,"e":266800,"l":"C"},{"p":349500,"e":259000,"l":"C"},{"p":699888,"e":599600,"l":"D"},{"p":239000,"e":192000,"l":"D"},{"p":350000,"e":148000,"l":"C"},{"p":839000,"e":415200,"l":"C"},{"p":1050000,"e":605900,"l":"B"},{"p":548000,"e":352400,"l":"C"},{"p":199900,"e":227600,"l":"C"},{"p":1899000,"e":360500,"l":"C"},{"p":1115000,"e":983000,"l":"D"},{"p":1290000,"e":636600,"l":"D"},{"p":629000,"e":215500,"l":"C"},{"p":549900,"e":314500,"l":"C"},{"p":1049000,"e":849700,"l":"A"},{"p":1100000,"e":610400,"l":"A"},{"p":750000,"e":848000,"l":"B"},{"p":329000,"e":520300,"l":"B"},{"p":399000,"e":362000,"l":"B"},{"p":1790000,"e":671000,"l":"B"},{"p":469999,"e":534400,"l":"B"},{"p":750000,"e":585000,"l":"A"},{"p":229000,"e":326600,"l":"A"},{"p":605000,"e":518900,"l":"B"},{"p":695000,"e":638700,"l":"B"},{"p":849900,"e":753000,"l":"B"},{"p":949800,"e":944300,"l":"A"},{"p":5800000,"e":3009300,"l":"D"},{"p":399900,"e":439500,"l":"C"},{"p":549000,"e":570500,"l":"A"},{"p":449000,"e":344200,"l":"C"},{"p":969900,"e":392200,"l":"D"},{"p":249000,"e":211400,"l":"B"},{"p":314900,"e":326500,"l":"B"},{"p":274700,"e":226300,"l":"B"},{"p":799000,"e":447900,"l":"C"},{"p":549000,"e":426800,"l":"B"},{"p":299000,"e":368700,"l":"B"},{"p":379000,"e":333900,"l":"B"},{"p":68912,"e":140600,"l":"D"},{"p":1100000,"e":126100,"l":"D"},{"p":335000,"e":406100,"l":"D"},{"p":269000,"e":186300,"l":"C"},{"p":295000,"e":518700,"l":"D"},{"p":84900,"e":220000,"l":"D"},{"p":314900,"e":346500,"l":"A"},{"p":259000,"e":295200,"l":"B"},{"p":424900,"e":348600,"l":"A"},{"p":228900,"e":301600,"l":"B"},{"p":789000,"e":470100,"l":"B"},{"p":3000000,"e":758200,"l":"D"},{"p":1200000,"e":1198400,"l":"A"},{"p":589000,"e":486600,"l":"B"},{"p":439000,"e":427800,"l":"B"},{"p":225000,"e":161700,"l":"C"},{"p":275000,"e":214600,"l":"B"},{"p":329000,"e":343500,"l":"A"},{"p":699000,"e":381200,"l":"D"},{"p":1075000,"e":983300,"l":"B"},{"p":589900,"e":300100,"l":"D"},{"p":315000,"e":332200,"l":"A"},{"p":265000,"e":266900,"l":"A"},{"p":179000,"e":168700,"l":"B"},{"p":389000,"e":295200,"l":"B"},{"p":239000,"e":222200,"l":"C"},{"p":135000,"e":269000,"l":"B"},{"p":142000,"e":179400,"l":"B"},{"p":599000,"e":640300,"l":"A"},{"p":295000,"e":429300,"l":"A"},{"p":4850000,"e":3558000,"l":"D"},{"p":949900,"e":1177800,"l":"A"},{"p":928000,"e":783900,"l":"B"},{"p":649000,"e":530900,"l":"B"},{"p":1599900,"e":1606000,"l":"D"},{"p":1219900,"e":895200,"l":"C"},{"p":425000,"e":858000,"l":"B"},{"p":359000,"e":342900,"l":"C"},{"p":599000,"e":755000,"l":"C"},{"p":699000,"e":713200,"l":"B"},{"p":434900,"e":611600,"l":"A"},{"p":489000,"e":639100,"l":"A"},{"p":1549000,"e":1242400,"l":"B"},{"p":639000,"e":728000,"l":"A"},{"p":139900,"e":952700,"l":"D"},{"p":2198000,"e":814400,"l":"D"},{"p":398999,"e":685100,"l":"B"},{"p":587000,"e":780800,"l":"A"},{"p":1800000,"e":1523000,"l":"C"},{"p":599000,"e":1228100,"l":"C"},{"p":741700,"e":1208900,"l":"B"},{"p":378000,"e":379200,"l":"B"},{"p":219000,"e":822400,"l":"C"},{"p":859000,"e":1072800,"l":"B"},{"p":899000,"e":1413000,"l":"C"},{"p":1799888,"e":902700,"l":"A"},{"p":584000,"e":1000900,"l":"B"},{"p":950000,"e":1339500,"l":"D"},{"p":975000,"e":1029200,"l":"C"},{"p":398500,"e":330800,"l":"C"},{"p":649000,"e":1529500,"l":"C"},{"p":3389000,"e":623100,"l":"D"},{"p":1825000,"e":1091100,"l":"D"},{"p":539000,"e":712100,"l":"C"},{"p":1238000,"e":1210600,"l":"C"},{"p":2500000,"e":1809600,"l":"C"},{"p":1949000,"e":1726200,"l":"C"},{"p":764999,"e":922100,"l":"B"},{"p":998000,"e":2176500,"l":"D"},{"p":625000,"e":1493400,"l":"C"},{"p":939000,"e":2162500,"l":"D"},{"p":525000,"e":308200,"l":"A"},{"p":395000,"e":817500,"l":"D"},{"p":3777000,"e":1503300,"l":"C"},{"p":995000,"e":553200,"l":"D"},{"p":449000,"e":354600,"l":"C"},{"p":575000,"e":2251100,"l":"C"},{"p":1795000,"e":788800,"l":"A"},{"p":546000,"e":873500,"l":"D"},{"p":379000,"e":280200,"l":"D"},{"p":425000,"e":456600,"l":"B"},{"p":425000,"e":6809200,"l":"D"},{"p":289000,"e":498400,"l":"C"},{"p":1898000,"e":1832600,"l":"A"},{"p":2800000,"e":916300,"l":"A"},{"p":299000,"e":237200,"l":"D"},{"p":360000,"e":659500,"l":"C"},{"p":269000,"e":6285600,"l":"D"},{"p":475000,"e":2995400,"l":"D"},{"p":1164900,"e":1090200,"l":"B"},{"p":654751,"e":709600,"l":"D"},{"p":1199000,"e":891000,"l":"B"},{"p":1049000,"e":1006500,"l":"A"},{"p":1425000,"e":1969600,"l":"A"},{"p":2595000,"e":1730900,"l":"C"},{"p":250000,"e":428100,"l":"C"},{"p":480000,"e":347800,"l":"D"},{"p":3495000,"e":4044900,"l":"D"},{"p":3485000,"e":2345700,"l":"C"},{"p":719000,"e":786500,"l":"D"},{"p":430000,"e":429100,"l":"A"},{"p":1399000,"e":846600,"l":"D"},{"p":899000,"e":1222200,"l":"B"},{"p":995000,"e":1185600,"l":"C"},{"p":380000,"e":423800,"l":"B"},{"p":1399900,"e":1341600,"l":"B"},{"p":949000,"e":973100,"l":"B"},{"p":1995000,"e":562600,"l":"A"},{"p":432000,"e":619400,"l":"A"},{"p":308000,"e":395400,"l":"A"},{"p":359000,"e":494700,"l":"B"},{"p":2998000,"e":2740100,"l":"B"},{"p":1269000,"e":675100,"l":"A"},{"p":439000,"e":733000,"l":"C"},{"p":385000,"e":587100,"l":"A"},{"p":614000,"e":549700,"l":"B"},{"p":1189000,"e":1076500,"l":"A"},{"p":476900,"e":468300,"l":"A"},{"p":379000,"e":424500,"l":"B"},{"p":474500,"e":487000,"l":"A"},{"p":389000,"e":449200,"l":"A"},{"p":959000,"e":897700,"l":"A"},{"p":75000,"e":775300,"l":"D"},{"p":409999,"e":633900,"l":"B"},{"p":549000,"e":571100,"l":"A"},{"p":326000,"e":438600,"l":"A"},{"p":680000,"e":513400,"l":"B"},{"p":624900,"e":508200,"l":"A"},{"p":675000,"e":750700,"l":"A"},{"p":589000,"e":901900,"l":"B"},{"p":1899900,"e":532100,"l":"B"},{"p":1349900,"e":1188900,"l":"A"},{"p":329000,"e":335300,"l":"C"},{"p":1190000,"e":1071900,"l":"A"},{"p":599000,"e":608500,"l":"A"},{"p":415000,"e":509900,"l":"A"},{"p":874000,"e":820900,"l":"B"},{"p":865000,"e":701200,"l":"C"},{"p":448000,"e":261400,"l":"D"},{"p":1389000,"e":764500,"l":"A"},{"p":2390000,"e":1969400,"l":"A"},{"p":695000,"e":590800,"l":"A"},{"p":1370000,"e":1270500,"l":"A"},{"p":400000,"e":499000,"l":"A"},{"p":729000,"e":701900,"l":"A"},{"p":550000,"e":996600,"l":"A"},{"p":749500,"e":718300,"l":"A"},{"p":265000,"e":400800,"l":"B"},{"p":3950000,"e":1111600,"l":"C"},{"p":155000,"e":142900,"l":"D"},{"p":279000,"e":232000,"l":"D"},{"p":479000,"e":397700,"l":"C"},{"p":229900,"e":373100,"l":"C"},{"p":389900,"e":431700,"l":"D"},{"p":649900,"e":300400,"l":"C"},{"p":225000,"e":193100,"l":"D"},{"p":479000,"e":379500,"l":"B"},{"p":189500,"e":157400,"l":"D"},{"p":439000,"e":411600,"l":"B"},{"p":1450000,"e":164500,"l":"D"},{"p":695000,"e":611900,"l":"A"},{"p":2590000,"e":769500,"l":"B"},{"p":499999,"e":420800,"l":"C"},{"p":1395000,"e":944700,"l":"B"},{"p":264900,"e":396100,"l":"B"},{"p":1095000,"e":846300,"l":"B"},{"p":543700,"e":451900,"l":"B"},{"p":574900,"e":272600,"l":"D"},{"p":695000,"e":507800,"l":"C"},{"p":230000,"e":418600,"l":"B"},{"p":549000,"e":360500,"l":"A"},{"p":399000,"e":402400,"l":"C"},{"p":259000,"e":174400,"l":"C"},{"p":679000,"e":539700,"l":"B"},{"p":799000,"e":533000,"l":"C"},{"p":1499999,"e":955500,"l":"C"},{"p":535000,"e":548300,"l":"B"},{"p":575000,"e":626000,"l":"B"},{"p":849000,"e":739200,"l":"C"},{"p":150000,"e":203600,"l":"D"},{"p":789900,"e":669300,"l":"B"},{"p":535000,"e":477100,"l":"A"},{"p":224900,"e":293700,"l":"B"},{"p":549000,"e":376400,"l":"C"},{"p":560000,"e":417700,"l":"A"},{"p":265000,"e":308600,"l":"B"},{"p":829000,"e":859500,"l":"B"},{"p":324000,"e":400000,"l":"A"},{"p":619000,"e":653900,"l":"A"},{"p":1388000,"e":1131100,"l":"B"},{"p":839000,"e":621600,"l":"B"},{"p":414800,"e":461300,"l":"D"},{"p":624900,"e":539100,"l":"B"},{"p":1099000,"e":750300,"l":"A"},{"p":1049000,"e":1107100,"l":"B"},{"p":749900,"e":753900,"l":"A"},{"p":2037000,"e":1017300,"l":"C"},{"p":449000,"e":270900,"l":"D"},{"p":479000,"e":386300,"l":"B"},{"p":599000,"e":417100,"l":"B"},{"p":1649900,"e":1091100,"l":"A"},{"p":868000,"e":835000,"l":"B"},{"p":1099900,"e":1064400,"l":"B"},{"p":175000,"e":300600,"l":"C"},{"p":899000,"e":835800,"l":"C"},{"p":1149000,"e":896100,"l":"B"},{"p":689000,"e":432100,"l":"D"},{"p":525000,"e":307400,"l":"D"},{"p":599000,"e":439000,"l":"C"},{"p":500000,"e":513200,"l":"C"},{"p":2699000,"e":2462300,"l":"C"},{"p":1188900,"e":632900,"l":"C"},{"p":449000,"e":575200,"l":"C"},{"p":399900,"e":258300,"l":"D"},{"p":679000,"e":550100,"l":"B"},{"p":749900,"e":205200,"l":"D"},{"p":550000,"e":432800,"l":"C"},{"p":449000,"e":401900,"l":"C"},{"p":229900,"e":284200,"l":"B"},{"p":139900,"e":280400,"l":"B"},{"p":2995000,"e":920400,"l":"C"},{"p":399900,"e":363100,"l":"D"},{"p":1499000,"e":1187200,"l":"D"},{"p":324900,"e":272300,"l":"B"},{"p":539000,"e":500400,"l":"C"},{"p":995000,"e":974700,"l":"D"},{"p":625000,"e":487200,"l":"B"},{"p":233000,"e":233300,"l":"C"},{"p":322928,"e":261000,"l":"B"},{"p":272000,"e":305900,"l":"C"},{"p":299900,"e":137300,"l":"D"},{"p":529900,"e":553700,"l":"B"},{"p":499900,"e":489100,"l":"C"},{"p":299900,"e":447700,"l":"C"},{"p":199900,"e":91600,"l":"D"},{"p":350000,"e":361800,"l":"D"},{"p":599000,"e":563900,"l":"B"},{"p":459000,"e":108500,"l":"D"},{"p":190000,"e":80600,"l":"D"},{"p":481000,"e":424800,"l":"B"},{"p":599000,"e":504500,"l":"B"},{"p":525000,"e":532600,"l":"B"},{"p":1049000,"e":664500,"l":"C"},{"p":645000,"e":438200,"l":"C"},{"p":839850,"e":897300,"l":"B"},{"p":1100000,"e":855800,"l":"A"},{"p":199000,"e":206000,"l":"C"},{"p":474900,"e":512900,"l":"B"},{"p":509000,"e":516600,"l":"A"},{"p":649500,"e":607900,"l":"A"},{"p":435000,"e":458400,"l":"A"},{"p":475000,"e":390500,"l":"B"},{"p":475000,"e":403600,"l":"B"},{"p":596000,"e":520300,"l":"A"},{"p":529900,"e":508700,"l":"B"},{"p":895000,"e":591600,"l":"A"},{"p":13000000,"e":900200,"l":"C"},{"p":1295000,"e":934700,"l":"C"},{"p":505000,"e":572200,"l":"C"},{"p":599000,"e":360000,"l":"C"},{"p":599000,"e":620800,"l":"B"},{"p":299900,"e":303300,"l":"B"},{"p":574000,"e":518500,"l":"A"},{"p":669000,"e":734100,"l":"A"},{"p":749900,"e":658100,"l":"A"},{"p":359000,"e":393500,"l":"A"},{"p":355000,"e":483600,"l":"B"},{"p":529000,"e":599100,"l":"A"},{"p":679000,"e":682900,"l":"A"},{"p":999900,"e":769300,"l":"B"},{"p":695803,"e":631600,"l":"A"},{"p":1998000,"e":1663700,"l":"B"},{"p":777000,"e":645100,"l":"B"},{"p":549000,"e":508500,"l":"B"},{"p":1749900,"e":1004300,"l":"D"},{"p":405000,"e":513100,"l":"B"},{"p":349000,"e":440600,"l":"A"},{"p":549000,"e":200000,"l":"C"},{"p":210000,"e":158000,"l":"D"},{"p":849900,"e":552900,"l":"B"},{"p":2297000,"e":1392500,"l":"B"},{"p":639000,"e":560200,"l":"B"},{"p":389900,"e":518000,"l":"A"},{"p":429000,"e":500000,"l":"A"},{"p":385000,"e":477900,"l":"B"},{"p":1289000,"e":817800,"l":"A"},{"p":299900,"e":415400,"l":"A"},{"p":349000,"e":465200,"l":"B"},{"p":740000,"e":800400,"l":"A"},{"p":425000,"e":431100,"l":"C"},{"p":275000,"e":352800,"l":"B"},{"p":1125000,"e":1058300,"l":"B"},{"p":1200000,"e":1126900,"l":"A"},{"p":670000,"e":553400,"l":"A"},{"p":800000,"e":473600,"l":"B"},{"p":324900,"e":346100,"l":"C"},{"p":675000,"e":1252100,"l":"B"},{"p":1549000,"e":645000,"l":"A"},{"p":380000,"e":518300,"l":"A"},{"p":275000,"e":612200,"l":"B"},{"p":639000,"e":667100,"l":"A"},{"p":674900,"e":595600,"l":"D"},{"p":482000,"e":421100,"l":"C"},{"p":620000,"e":581800,"l":"A"},{"p":599900,"e":540700,"l":"A"},{"p":1185000,"e":964900,"l":"A"},{"p":674900,"e":623300,"l":"A"},{"p":599900,"e":512300,"l":"B"},{"p":774900,"e":738500,"l":"A"},{"p":934900,"e":726700,"l":"A"},{"p":774900,"e":894900,"l":"A"},{"p":874900,"e":940500,"l":"A"},{"p":525000,"e":527600,"l":"A"},{"p":299900,"e":632800,"l":"B"},{"p":595000,"e":516200,"l":"C"},{"p":475000,"e":490400,"l":"A"},{"p":539000,"e":493300,"l":"A"},{"p":299000,"e":407300,"l":"A"},{"p":225000,"e":318800,"l":"B"},{"p":524999,"e":480100,"l":"A"},{"p":355000,"e":338000,"l":"A"},{"p":599000,"e":568900,"l":"A"},{"p":625000,"e":497700,"l":"B"},{"p":369000,"e":403100,"l":"A"},{"p":695000,"e":587800,"l":"B"},{"p":739000,"e":523000,"l":"B"},{"p":990000,"e":788600,"l":"B"},{"p":719000,"e":700700,"l":"B"},{"p":549900,"e":495400,"l":"A"},{"p":727700,"e":761500,"l":"B"},{"p":769999,"e":715200,"l":"B"},{"p":674900,"e":790800,"l":"A"},{"p":599900,"e":645600,"l":"A"},{"p":599900,"e":592500,"l":"A"},{"p":1900000,"e":1606600,"l":"C"},{"p":562200,"e":1466000,"l":"D"},{"p":829000,"e":848200,"l":"A"},{"p":590000,"e":497000,"l":"B"},{"p":1195000,"e":619200,"l":"D"},{"p":3449900,"e":2849900,"l":"D"},{"p":999900,"e":956100,"l":"A"},{"p":319900,"e":412700,"l":"A"},{"p":299900,"e":373400,"l":"B"},{"p":899900,"e":722600,"l":"A"},{"p":649000,"e":629400,"l":"A"},{"p":949900,"e":821700,"l":"B"},{"p":625000,"e":575200,"l":"A"},{"p":399000,"e":513400,"l":"A"},{"p":1855000,"e":1262300,"l":"B"},{"p":364000,"e":427700,"l":"A"},{"p":899000,"e":919500,"l":"A"},{"p":1899000,"e":723900,"l":"B"},{"p":9750000,"e":523100,"l":"C"},{"p":398000,"e":479800,"l":"B"},{"p":319000,"e":373200,"l":"C"},{"p":774000,"e":583800,"l":"B"},{"p":579000,"e":559500,"l":"A"},{"p":549900,"e":435900,"l":"A"},{"p":2995000,"e":1721300,"l":"C"},{"p":539000,"e":422600,"l":"B"},{"p":639000,"e":534000,"l":"B"},{"p":145000,"e":107800,"l":"D"},{"p":549000,"e":485800,"l":"C"},{"p":749000,"e":659900,"l":"B"},{"p":595000,"e":545600,"l":"C"},{"p":425000,"e":361700,"l":"B"},{"p":199900,"e":183300,"l":"C"},{"p":774900,"e":578900,"l":"A"},{"p":399000,"e":619200,"l":"C"},{"p":1250000,"e":717400,"l":"B"},{"p":80000,"e":223100,"l":"D"},{"p":299900,"e":295900,"l":"D"},{"p":899900,"e":500500,"l":"B"},{"p":539900,"e":436200,"l":"A"},{"p":375000,"e":367400,"l":"A"},{"p":274900,"e":541700,"l":"D"},{"p":469900,"e":483100,"l":"B"},{"p":519900,"e":585200,"l":"A"},{"p":469900,"e":476000,"l":"A"},{"p":242900,"e":497100,"l":"B"},{"p":999900,"e":949200,"l":"A"},{"p":749900,"e":711700,"l":"B"},{"p":8500000,"e":471000,"l":"D"},{"p":209900,"e":251200,"l":"C"},{"p":549900,"e":528800,"l":"A"},{"p":282500,"e":367600,"l":"B"},{"p":549900,"e":601300,"l":"B"},{"p":339900,"e":412600,"l":"A"},{"p":325000,"e":510100,"l":"B"},{"p":1238888,"e":1154500,"l":"A"},{"p":499900,"e":401600,"l":"B"},{"p":349800,"e":427700,"l":"A"},{"p":305000,"e":360500,"l":"A"},{"p":539900,"e":560400,"l":"A"},{"p":495000,"e":359600,"l":"C"},{"p":2650000,"e":653200,"l":"C"},{"p":879000,"e":643100,"l":"B"},{"p":389900,"e":351900,"l":"A"},{"p":369000,"e":402700,"l":"A"},{"p":350000,"e":485600,"l":"D"},{"p":299000,"e":226000,"l":"B"},{"p":599900,"e":490900,"l":"B"},{"p":894000,"e":1033700,"l":"B"},{"p":612900,"e":390200,"l":"B"},{"p":325000,"e":404800,"l":"A"},{"p":849900,"e":735800,"l":"A"},{"p":289900,"e":468900,"l":"B"},{"p":249000,"e":474700,"l":"A"},{"p":209000,"e":202800,"l":"B"},{"p":57000,"e":195500,"l":"D"},{"p":695000,"e":714800,"l":"A"},{"p":374900,"e":401900,"l":"B"},{"p":789000,"e":614600,"l":"C"},{"p":359900,"e":394500,"l":"B"},{"p":374900,"e":289500,"l":"D"},{"p":399000,"e":180700,"l":"C"},{"p":125000,"e":185600,"l":"B"},{"p":389000,"e":361300,"l":"A"},{"p":449999,"e":530000,"l":"A"},{"p":534999,"e":491600,"l":"A"},{"p":635000,"e":387000,"l":"B"},{"p":339999,"e":456600,"l":"A"},{"p":309900,"e":295300,"l":"B"},{"p":449900,"e":616600,"l":"A"},{"p":445000,"e":443800,"l":"A"},{"p":679900,"e":556200,"l":"A"},{"p":595000,"e":686300,"l":"B"},{"p":359000,"e":379500,"l":"C"},{"p":170000,"e":147400,"l":"B"},{"p":319900,"e":462000,"l":"A"},{"p":270000,"e":255700,"l":"D"},{"p":899900,"e":854900,"l":"B"},{"p":189000,"e":167300,"l":"C"},{"p":819900,"e":915600,"l":"B"},{"p":949000,"e":1060200,"l":"B"},{"p":499500,"e":468600,"l":"C"},{"p":369000,"e":418400,"l":"A"},{"p":698000,"e":518800,"l":"C"},{"p":999999,"e":353700,"l":"B"},{"p":899900,"e":805600,"l":"B"},{"p":599900,"e":565300,"l":"D"},{"p":1199000,"e":679400,"l":"C"},{"p":759900,"e":725900,"l":"B"},{"p":625000,"e":544500,"l":"A"},{"p":499000,"e":515200,"l":"A"},{"p":1875000,"e":1411200,"l":"D"},{"p":14998000,"e":3301000,"l":"D"},{"p":2778865,"e":2009400,"l":"B"},{"p":512285,"e":1889000,"l":"D"},{"p":700065,"e":2318900,"l":"D"},{"p":2649000,"e":2134400,"l":"A"},{"p":840000,"e":784400,"l":"A"},{"p":469998,"e":523700,"l":"A"},{"p":998500,"e":723100,"l":"B"},{"p":489000,"e":536100,"l":"A"},{"p":414900,"e":360700,"l":"B"},{"p":429000,"e":319900,"l":"C"},{"p":875000,"e":774800,"l":"B"},{"p":1285000,"e":514300,"l":"C"},{"p":1150000,"e":832400,"l":"A"},{"p":890000,"e":580700,"l":"B"},{"p":2695000,"e":1530700,"l":"B"},{"p":2500000,"e":464700,"l":"D"},{"p":439000,"e":498400,"l":"C"},{"p":2695000,"e":2103700,"l":"B"},{"p":475000,"e":363400,"l":"B"},{"p":519000,"e":563900,"l":"D"},{"p":695000,"e":505000,"l":"C"},{"p":1549000,"e":471300,"l":"D"},{"p":732000,"e":638600,"l":"B"},{"p":1649000,"e":741300,"l":"D"},{"p":759000,"e":884200,"l":"B"},{"p":2248000,"e":1667900,"l":"B"},{"p":391950,"e":535800,"l":"C"},{"p":2998000,"e":904900,"l":"C"},{"p":595000,"e":196200,"l":"D"},{"p":3695000,"e":1719500,"l":"C"},{"p":1500000,"e":1344500,"l":"C"},{"p":899000,"e":657300,"l":"B"},{"p":2695000,"e":479900,"l":"A"},{"p":1745000,"e":749300,"l":"C"},{"p":849000,"e":924100,"l":"B"},{"p":1390000,"e":754100,"l":"C"},{"p":519000,"e":459900,"l":"A"},{"p":524999,"e":568900,"l":"A"},{"p":525000,"e":471800,"l":"C"},{"p":449000,"e":472600,"l":"A"},{"p":449000,"e":514000,"l":"A"},{"p":499888,"e":682100,"l":"A"},{"p":469000,"e":562800,"l":"A"},{"p":875000,"e":900300,"l":"C"},{"p":1095000,"e":576900,"l":"B"},{"p":334800,"e":408900,"l":"C"},{"p":165000,"e":139600,"l":"D"},{"p":965000,"e":679900,"l":"B"},{"p":399000,"e":657200,"l":"B"},{"p":459900,"e":561100,"l":"A"},{"p":980000,"e":407700,"l":"B"},{"p":242600,"e":354800,"l":"B"},{"p":139900,"e":410500,"l":"A"},{"p":998000,"e":1174100,"l":"C"},{"p":1348000,"e":1107400,"l":"B"},{"p":369000,"e":234300,"l":"C"},{"p":269000,"e":407600,"l":"A"},{"p":1029400,"e":1151300,"l":"A"},{"p":12500000,"e":1281300,"l":"D"},{"p":3800000,"e":1297800,"l":"D"},{"p":457300,"e":541000,"l":"A"},{"p":1115990,"e":1066400,"l":"A"},{"p":375000,"e":367000,"l":"A"},{"p":665000,"e":404400,"l":"B"},{"p":225000,"e":219900,"l":"C"},{"p":399000,"e":459100,"l":"A"},{"p":389000,"e":367800,"l":"B"},{"p":599000,"e":466800,"l":"D"},{"p":329000,"e":275000,"l":"B"},{"p":329000,"e":366500,"l":"D"},{"p":190475,"e":238900,"l":"D"},{"p":585000,"e":551100,"l":"B"},{"p":335000,"e":260800,"l":"B"},{"p":541900,"e":580900,"l":"B"},{"p":589000,"e":617300,"l":"A"},{"p":349000,"e":320900,"l":"B"},{"p":159000,"e":167800,"l":"C"},{"p":599000,"e":655100,"l":"A"},{"p":681500,"e":692600,"l":"A"},{"p":199000,"e":205400,"l":"D"},{"p":299000,"e":201400,"l":"D"},{"p":299000,"e":284300,"l":"D"},{"p":1339800,"e":1399100,"l":"B"},{"p":1498800,"e":1664600,"l":"B"},{"p":599000,"e":468200,"l":"C"},{"p":499990,"e":874400,"l":"B"},{"p":469000,"e":1033100,"l":"D"},{"p":649000,"e":450700,"l":"B"},{"p":950000,"e":576900,"l":"C"},{"p":649900,"e":689100,"l":"A"},{"p":895000,"e":959800,"l":"A"},{"p":499500,"e":463700,"l":"A"},{"p":699000,"e":832100,"l":"B"},{"p":2049900,"e":2189000,"l":"B"},{"p":1050000,"e":609000,"l":"C"},{"p":1085600,"e":716600,"l":"D"},{"p":409000,"e":379300,"l":"B"},{"p":1625000,"e":1437300,"l":"B"},{"p":289600,"e":411200,"l":"B"},{"p":93000,"e":70500,"l":"D"},{"p":355000,"e":476700,"l":"A"},{"p":168200,"e":287100,"l":"C"},{"p":401443,"e":337500,"l":"A"},{"p":995000,"e":865600,"l":"A"},{"p":60000,"e":128500,"l":"D"},{"p":649000,"e":671000,"l":"A"},{"p":724900,"e":1625200,"l":"B"},{"p":99500,"e":133700,"l":"C"},{"p":525000,"e":785900,"l":"B"},{"p":58680,"e":769100,"l":"B"},{"p":439000,"e":557700,"l":"A"},{"p":365000,"e":548100,"l":"D"},{"p":398557,"e":435700,"l":"B"},{"p":990000,"e":1046400,"l":"B"},{"p":180000,"e":338200,"l":"D"},{"p":319000,"e":654100,"l":"D"},{"p":983200,"e":1308500,"l":"A"},{"p":269000,"e":719800,"l":"C"},{"p":469900,"e":546000,"l":"A"},{"p":324000,"e":414600,"l":"A"},{"p":285000,"e":172900,"l":"D"},{"p":525000,"e":162200,"l":"D"},{"p":229000,"e":287100,"l":"B"},{"p":449000,"e":503600,"l":"D"},{"p":339750,"e":270400,"l":"B"},{"p":1599000,"e":1460200,"l":"D"},{"p":265000,"e":371900,"l":"B"},{"p":339000,"e":325600,"l":"A"},{"p":594900,"e":600100,"l":"B"},{"p":350000,"e":344700,"l":"B"},{"p":565000,"e":487300,"l":"C"},{"p":359000,"e":481100,"l":"A"},{"p":550000,"e":373800,"l":"B"},{"p":419000,"e":390300,"l":"A"},{"p":165000,"e":824100,"l":"B"},{"p":240000,"e":256100,"l":"C"},{"p":649000,"e":364900,"l":"C"},{"p":578000,"e":576400,"l":"A"},{"p":749900,"e":723200,"l":"B"},{"p":379900,"e":429000,"l":"A"},{"p":599900,"e":498600,"l":"A"},{"p":530000,"e":520200,"l":"B"},{"p":259500,"e":313600,"l":"B"},{"p":99900,"e":227100,"l":"B"},{"p":1175000,"e":933700,"l":"D"},{"p":469000,"e":515000,"l":"C"},{"p":895000,"e":648000,"l":"A"},{"p":295000,"e":364300,"l":"A"},{"p":315000,"e":339000,"l":"A"},{"p":695000,"e":566800,"l":"A"},{"p":669900,"e":736400,"l":"C"},{"p":319000,"e":323600,"l":"B"},{"p":469000,"e":1297700,"l":"D"},{"p":399000,"e":361500,"l":"A"},{"p":224500,"e":132200,"l":"D"},{"p":699000,"e":657100,"l":"C"},{"p":639900,"e":324100,"l":"D"},{"p":369000,"e":313500,"l":"B"},{"p":809900,"e":588900,"l":"D"},{"p":739000,"e":674200,"l":"D"},{"p":439000,"e":252700,"l":"D"},{"p":345000,"e":1349700,"l":"D"},{"p":579999,"e":367600,"l":"B"},{"p":899000,"e":384200,"l":"D"},{"p":414900,"e":475900,"l":"A"},{"p":83000,"e":191600,"l":"B"},{"p":269900,"e":213300,"l":"D"},{"p":415000,"e":139400,"l":"D"},{"p":275000,"e":255100,"l":"D"},{"p":349000,"e":273000,"l":"C"},{"p":549000,"e":375900,"l":"B"},{"p":399000,"e":423200,"l":"B"},{"p":472000,"e":479000,"l":"D"},{"p":130000,"e":130200,"l":"B"},{"p":344900,"e":381300,"l":"A"},{"p":339000,"e":346500,"l":"A"},{"p":491411,"e":502000,"l":"B"},{"p":1249900,"e":1234200,"l":"B"},{"p":585000,"e":508600,"l":"B"},{"p":949900,"e":876500,"l":"A"},{"p":379900,"e":394400,"l":"C"},{"p":389000,"e":457000,"l":"C"},{"p":174500,"e":175100,"l":"B"},{"p":89900,"e":75100,"l":"D"},{"p":239500,"e":244500,"l":"B"},{"p":1495000,"e":1134200,"l":"B"},{"p":139000,"e":194700,"l":"A"},{"p":1125000,"e":1072100,"l":"D"},{"p":349900,"e":505100,"l":"C"},{"p":75000,"e":140000,"l":"D"},{"p":105000,"e":229600,"l":"D"},{"p":849900,"e":935200,"l":"C"},{"p":378000,"e":226700,"l":"C"},{"p":699000,"e":375700,"l":"C"},{"p":675000,"e":1264500,"l":"D"},{"p":400000,"e":416600,"l":"A"},{"p":795000,"e":579800,"l":"A"},{"p":745000,"e":648700,"l":"A"},{"p":1200000,"e":1043700,"l":"A"},{"p":925000,"e":913100,"l":"A"},{"p":275000,"e":163200,"l":"C"},{"p":279000,"e":332900,"l":"A"},{"p":629000,"e":584900,"l":"B"},{"p":389000,"e":506400,"l":"A"},{"p":1299000,"e":608900,"l":"C"},{"p":419000,"e":401300,"l":"C"},{"p":969000,"e":479400,"l":"C"},{"p":285000,"e":382800,"l":"A"},{"p":595000,"e":491000,"l":"B"},{"p":644900,"e":601200,"l":"A"},{"p":729000,"e":1208900,"l":"B"},{"p":499000,"e":1039000,"l":"B"},{"p":719900,"e":586900,"l":"A"},{"p":55000,"e":717200,"l":"B"},{"p":449000,"e":557500,"l":"B"},{"p":385900,"e":624600,"l":"B"},{"p":849000,"e":930200,"l":"B"},{"p":1195000,"e":704200,"l":"A"},{"p":469000,"e":350900,"l":"B"},{"p":365000,"e":234100,"l":"D"},{"p":426900,"e":479600,"l":"B"},{"p":699900,"e":542400,"l":"B"},{"p":385000,"e":528900,"l":"A"},{"p":569000,"e":484900,"l":"C"},{"p":424900,"e":456700,"l":"A"},{"p":185000,"e":187100,"l":"D"},{"p":389900,"e":377900,"l":"D"},{"p":224999,"e":309700,"l":"D"},{"p":599000,"e":437600,"l":"D"},{"p":3998000,"e":241800,"l":"D"},{"p":2295000,"e":1396900,"l":"B"},{"p":1299000,"e":1646300,"l":"A"},{"p":849000,"e":895900,"l":"A"},{"p":530000,"e":476400,"l":"B"},{"p":599000,"e":836800,"l":"D"},{"p":1539000,"e":4595700,"l":"D"},{"p":615000,"e":999000,"l":"B"},{"p":179500,"e":249800,"l":"A"},{"p":65000,"e":112900,"l":"D"},{"p":174900,"e":224100,"l":"C"},{"p":1348888,"e":1199500,"l":"A"},{"p":279000,"e":529900,"l":"D"},{"p":790000,"e":218600,"l":"D"},{"p":1276000,"e":827300,"l":"B"},{"p":384900,"e":378100,"l":"B"},{"p":319900,"e":378300,"l":"B"},{"p":735725,"e":406200,"l":"B"},{"p":449000,"e":588600,"l":"B"},{"p":459000,"e":633100,"l":"B"},{"p":99000,"e":300600,"l":"D"},{"p":250000,"e":240400,"l":"D"},{"p":985000,"e":901700,"l":"A"},{"p":918000,"e":1045000,"l":"C"},{"p":830000,"e":638200,"l":"B"},{"p":299000,"e":426400,"l":"D"},{"p":735725,"e":448000,"l":"B"},{"p":395000,"e":462500,"l":"A"},{"p":1080000,"e":334500,"l":"B"},{"p":299500,"e":263400,"l":"A"},{"p":429000,"e":471300,"l":"A"},{"p":99000,"e":99300,"l":"D"},{"p":469000,"e":397600,"l":"B"},{"p":510000,"e":382800,"l":"B"},{"p":322000,"e":330800,"l":"B"},{"p":1225000,"e":850700,"l":"B"},{"p":130000,"e":186300,"l":"D"},{"p":650000,"e":517900,"l":"B"},{"p":435000,"e":444100,"l":"A"},{"p":634900,"e":642700,"l":"A"},{"p":360000,"e":343200,"l":"A"},{"p":299000,"e":249100,"l":"B"},{"p":449000,"e":304500,"l":"C"},{"p":785000,"e":568400,"l":"B"},{"p":540000,"e":880600,"l":"D"},{"p":598000,"e":313000,"l":"D"},{"p":319500,"e":317100,"l":"A"},{"p":360000,"e":383000,"l":"A"},{"p":378998,"e":353300,"l":"D"},{"p":699900,"e":514400,"l":"B"},{"p":87500,"e":547200,"l":"B"},{"p":330000,"e":369300,"l":"B"},{"p":475000,"e":400700,"l":"B"},{"p":617000,"e":464800,"l":"C"},{"p":698000,"e":667300,"l":"B"},{"p":424900,"e":445500,"l":"A"},{"p":869400,"e":410800,"l":"D"},{"p":412500,"e":308500,"l":"D"},{"p":678000,"e":566700,"l":"B"},{"p":838400,"e":402000,"l":"D"},{"p":824900,"e":288600,"l":"C"},{"p":214000,"e":560800,"l":"B"},{"p":835000,"e":850700,"l":"C"},{"p":739000,"e":897600,"l":"C"},{"p":799000,"e":816500,"l":"A"},{"p":412000,"e":551200,"l":"C"},{"p":518000,"e":536700,"l":"D"},{"p":800000,"e":639400,"l":"A"},{"p":399000,"e":171000,"l":"C"},{"p":698785,"e":704700,"l":"A"},{"p":749999,"e":544500,"l":"B"},{"p":635000,"e":412600,"l":"C"},{"p":479000,"e":501600,"l":"A"},{"p":425000,"e":404600,"l":"B"},{"p":535000,"e":549000,"l":"A"},{"p":579000,"e":470500,"l":"B"},{"p":438881,"e":423400,"l":"B"},{"p":1139000,"e":983500,"l":"D"},{"p":325000,"e":401500,"l":"B"},{"p":799000,"e":605900,"l":"A"},{"p":599000,"e":473900,"l":"A"},{"p":529000,"e":304500,"l":"C"},{"p":619900,"e":554700,"l":"B"},{"p":379500,"e":460800,"l":"A"},{"p":614999,"e":542500,"l":"A"},{"p":599900,"e":326800,"l":"B"},{"p":599000,"e":436900,"l":"B"},{"p":999000,"e":964200,"l":"B"},{"p":135000,"e":663300,"l":"D"},{"p":425000,"e":479400,"l":"B"},{"p":669900,"e":619800,"l":"B"},{"p":449000,"e":361700,"l":"B"},{"p":995000,"e":1172800,"l":"B"},{"p":479000,"e":334300,"l":"A"},{"p":600000,"e":475600,"l":"B"},{"p":799999,"e":781800,"l":"B"},{"p":785000,"e":680800,"l":"A"},{"p":994500,"e":833500,"l":"A"},{"p":1350000,"e":781800,"l":"C"},{"p":737000,"e":714900,"l":"A"},{"p":729000,"e":617800,"l":"A"},{"p":549000,"e":415200,"l":"B"},{"p":1199900,"e":530400,"l":"C"},{"p":499000,"e":383700,"l":"C"},{"p":390000,"e":381400,"l":"A"},{"p":538020,"e":517100,"l":"B"},{"p":820000,"e":481700,"l":"D"},{"p":265900,"e":202000,"l":"C"},{"p":857000,"e":678200,"l":"A"},{"p":429000,"e":712400,"l":"B"},{"p":244900,"e":426400,"l":"D"},{"p":835000,"e":788100,"l":"A"},{"p":369950,"e":743600,"l":"D"},{"p":935000,"e":1171800,"l":"C"},{"p":509900,"e":657200,"l":"B"},{"p":659000,"e":468100,"l":"B"},{"p":588000,"e":1240100,"l":"B"},{"p":372088,"e":500000,"l":"B"},{"p":460000,"e":450200,"l":"C"},{"p":599000,"e":457300,"l":"C"},{"p":1395000,"e":950900,"l":"C"},{"p":1290000,"e":1145500,"l":"C"},{"p":1585000,"e":1314100,"l":"C"},{"p":725000,"e":491000,"l":"B"},{"p":379000,"e":210900,"l":"D"},{"p":970000,"e":794000,"l":"A"},{"p":485000,"e":676200,"l":"D"},{"p":560000,"e":573300,"l":"B"},{"p":1200000,"e":769100,"l":"A"},{"p":432000,"e":493000,"l":"A"},{"p":630000,"e":642400,"l":"A"},{"p":579500,"e":468900,"l":"B"},{"p":569000,"e":528200,"l":"A"},{"p":550000,"e":578400,"l":"A"},{"p":589900,"e":639400,"l":"A"},{"p":620000,"e":581800,"l":"A"},{"p":749000,"e":741800,"l":"B"},{"p":759000,"e":712700,"l":"A"},{"p":1231470,"e":441200,"l":"C"},{"p":440000,"e":587300,"l":"B"},{"p":525000,"e":751400,"l":"A"},{"p":669000,"e":644200,"l":"A"},{"p":1049000,"e":976600,"l":"A"},{"p":597799,"e":600800,"l":"A"},{"p":699000,"e":616500,"l":"A"},{"p":775000,"e":839100,"l":"B"},{"p":315000,"e":391300,"l":"B"},{"p":999990,"e":429100,"l":"B"},{"p":459000,"e":518300,"l":"A"},{"p":899000,"e":628500,"l":"D"},{"p":626220,"e":554000,"l":"C"},{"p":1000000,"e":687400,"l":"B"},{"p":898000,"e":768900,"l":"A"},{"p":521766,"e":422200,"l":"B"},{"p":324500,"e":386600,"l":"A"},{"p":299900,"e":342800,"l":"A"},{"p":599900,"e":613000,"l":"A"},{"p":969000,"e":850000,"l":"A"},{"p":739000,"e":746500,"l":"A"},{"p":399000,"e":400900,"l":"A"},{"p":635000,"e":677200,"l":"A"},{"p":484999,"e":490500,"l":"A"},{"p":495000,"e":442900,"l":"A"},{"p":529900,"e":568800,"l":"B"},{"p":799000,"e":543200,"l":"C"},{"p":299000,"e":353600,"l":"B"},{"p":413900,"e":440100,"l":"A"},{"p":599900,"e":662800,"l":"B"},{"p":879000,"e":782200,"l":"D"},{"p":859999,"e":841500,"l":"A"},{"p":300000,"e":94400,"l":"D"},{"p":299000,"e":295800,"l":"C"},{"p":629000,"e":467500,"l":"B"},{"p":449000,"e":421700,"l":"B"},{"p":1199000,"e":1138100,"l":"B"},{"p":305500,"e":550800,"l":"B"},{"p":369000,"e":550800,"l":"B"},{"p":595000,"e":547600,"l":"B"},{"p":525900,"e":432800,"l":"B"},{"p":365000,"e":390900,"l":"A"},{"p":1975000,"e":1425900,"l":"B"},{"p":829000,"e":703800,"l":"A"},{"p":350000,"e":292000,"l":"B"},{"p":450000,"e":368200,"l":"B"},{"p":440000,"e":382100,"l":"B"},{"p":325000,"e":318000,"l":"B"},{"p":449500,"e":488700,"l":"C"},{"p":790000,"e":428200,"l":"C"},{"p":539000,"e":529700,"l":"C"},{"p":439000,"e":310400,"l":"D"},{"p":1799000,"e":1311900,"l":"B"},{"p":799000,"e":658000,"l":"B"},{"p":299500,"e":577000,"l":"A"},{"p":1775000,"e":758000,"l":"A"},{"p":599900,"e":573700,"l":"B"},{"p":425000,"e":369400,"l":"B"},{"p":625000,"e":380500,"l":"D"},{"p":1295000,"e":1169200,"l":"B"},{"p":949000,"e":852900,"l":"A"},{"p":1395000,"e":994900,"l":"C"},{"p":949000,"e":1004200,"l":"B"},{"p":499000,"e":437700,"l":"C"},{"p":339900,"e":219200,"l":"C"},{"p":410000,"e":315900,"l":"C"},{"p":699900,"e":555400,"l":"A"},{"p":1490000,"e":734600,"l":"B"},{"p":249000,"e":318000,"l":"C"},{"p":345000,"e":393800,"l":"A"},{"p":1595000,"e":1263400,"l":"B"},{"p":1199000,"e":1177300,"l":"B"},{"p":999900,"e":743600,"l":"A"},{"p":395000,"e":305500,"l":"D"},{"p":400000,"e":297800,"l":"C"},{"p":399000,"e":378900,"l":"C"},{"p":949900,"e":690700,"l":"A"},{"p":414900,"e":414600,"l":"B"},{"p":400000,"e":1190300,"l":"C"},{"p":729000,"e":710900,"l":"A"},{"p":3250000,"e":2108800,"l":"C"},{"p":2500000,"e":1106800,"l":"C"},{"p":529000,"e":521700,"l":"B"},{"p":429000,"e":431900,"l":"C"},{"p":465000,"e":1185700,"l":"A"},{"p":619900,"e":597100,"l":"A"},{"p":595000,"e":521900,"l":"B"},{"p":869000,"e":349800,"l":"D"},{"p":599000,"e":563400,"l":"A"},{"p":298000,"e":407300,"l":"A"},{"p":274999,"e":309400,"l":"A"},{"p":1299000,"e":1143100,"l":"C"},{"p":394500,"e":379000,"l":"A"},{"p":235000,"e":277000,"l":"D"},{"p":250000,"e":291900,"l":"C"},{"p":449000,"e":562900,"l":"A"},{"p":499000,"e":316900,"l":"B"},{"p":589000,"e":585600,"l":"A"},{"p":79999,"e":426700,"l":"D"},{"p":1100000,"e":615000,"l":"C"},{"p":829000,"e":838300,"l":"A"},{"p":1075000,"e":656200,"l":"C"},{"p":299000,"e":409600,"l":"A"},{"p":949000,"e":940900,"l":"A"},{"p":1390000,"e":1374400,"l":"A"},{"p":465232,"e":494800,"l":"B"},{"p":239000,"e":226500,"l":"D"},{"p":1024900,"e":1072100,"l":"A"},{"p":1299000,"e":682500,"l":"D"},{"p":155000,"e":161000,"l":"C"},{"p":594000,"e":549100,"l":"B"},{"p":799500,"e":869900,"l":"A"},{"p":989000,"e":784600,"l":"B"},{"p":469900,"e":618700,"l":"A"},{"p":669000,"e":631800,"l":"A"},{"p":1295000,"e":1033600,"l":"B"},{"p":259900,"e":351300,"l":"B"},{"p":494900,"e":498000,"l":"A"},{"p":549900,"e":610100,"l":"A"},{"p":635000,"e":387000,"l":"B"},{"p":344000,"e":391600,"l":"C"},{"p":534895,"e":270600,"l":"D"},{"p":172000,"e":465700,"l":"D"},{"p":389900,"e":306800,"l":"B"},{"p":179900,"e":289500,"l":"D"},{"p":534000,"e":371000,"l":"C"},{"p":1099000,"e":898400,"l":"C"},{"p":349500,"e":318200,"l":"A"},{"p":299800,"e":488600,"l":"C"},{"p":349500,"e":250200,"l":"D"},{"p":99900,"e":498200,"l":"B"},{"p":995000,"e":427200,"l":"A"},{"p":1199000,"e":611600,"l":"C"},{"p":899900,"e":770800,"l":"C"},{"p":539500,"e":264100,"l":"B"},{"p":105000,"e":71000,"l":"D"},{"p":1299000,"e":903800,"l":"C"},{"p":1649000,"e":1938000,"l":"D"},{"p":1350000,"e":872100,"l":"C"},{"p":1399000,"e":758700,"l":"B"},{"p":2250000,"e":651700,"l":"C"},{"p":3499000,"e":1102200,"l":"C"},{"p":459000,"e":359500,"l":"C"},{"p":416500,"e":283100,"l":"C"},{"p":475000,"e":403500,"l":"B"},{"p":235000,"e":198300,"l":"C"},{"p":274800,"e":133500,"l":"C"},{"p":509000,"e":600300,"l":"B"},{"p":398000,"e":213500,"l":"D"},{"p":169000,"e":807900,"l":"D"},{"p":414900,"e":595600,"l":"D"},{"p":610000,"e":297800,"l":"C"},{"p":1149900,"e":876800,"l":"B"},{"p":639000,"e":705100,"l":"B"},{"p":199900,"e":266000,"l":"B"},{"p":749900,"e":756800,"l":"B"},{"p":824900,"e":798900,"l":"A"},{"p":90000,"e":272200,"l":"D"},{"p":410000,"e":390400,"l":"B"},{"p":345000,"e":304600,"l":"C"},{"p":239000,"e":188600,"l":"D"},{"p":325000,"e":364400,"l":"C"},{"p":439000,"e":465100,"l":"A"},{"p":430000,"e":358400,"l":"B"},{"p":399000,"e":614800,"l":"A"},{"p":599000,"e":590900,"l":"A"},{"p":199000,"e":297200,"l":"B"},{"p":425000,"e":452300,"l":"A"},{"p":429700,"e":288600,"l":"D"},{"p":769000,"e":663100,"l":"A"},{"p":699900,"e":671900,"l":"B"},{"p":699000,"e":716300,"l":"A"},{"p":324900,"e":404400,"l":"A"},{"p":499900,"e":539300,"l":"A"},{"p":325000,"e":337900,"l":"B"},{"p":374900,"e":310500,"l":"D"},{"p":625000,"e":390000,"l":"B"},{"p":239000,"e":178000,"l":"D"},{"p":620000,"e":1222600,"l":"D"},{"p":389000,"e":404900,"l":"A"},{"p":859900,"e":760800,"l":"B"},{"p":339900,"e":534500,"l":"B"},{"p":379000,"e":393000,"l":"A"},{"p":685000,"e":615500,"l":"B"},{"p":389000,"e":455000,"l":"A"},{"p":359900,"e":394500,"l":"B"},{"p":169900,"e":167000,"l":"D"},{"p":109000,"e":188600,"l":"B"},{"p":1100000,"e":921900,"l":"C"},{"p":524900,"e":410000,"l":"C"},{"p":499999,"e":387000,"l":"D"},{"p":279900,"e":297600,"l":"D"},{"p":799500,"e":590600,"l":"B"},{"p":389000,"e":476400,"l":"D"},{"p":994000,"e":218600,"l":"D"},{"p":619000,"e":552600,"l":"D"},{"p":275000,"e":339700,"l":"C"},{"p":359000,"e":348900,"l":"B"},{"p":579000,"e":453000,"l":"A"},{"p":228000,"e":231100,"l":"D"},{"p":625000,"e":598900,"l":"B"},{"p":499900,"e":354100,"l":"B"},{"p":899900,"e":805600,"l":"B"},{"p":459900,"e":389600,"l":"C"},{"p":935500,"e":754200,"l":"B"},{"p":839000,"e":716700,"l":"C"},{"p":364900,"e":462000,"l":"B"},{"p":275000,"e":339700,"l":"C"},{"p":438000,"e":429100,"l":"A"},{"p":425000,"e":448400,"l":"C"},{"p":315000,"e":333200,"l":"C"},{"p":435000,"e":632400,"l":"A"},{"p":145000,"e":164700,"l":"D"},{"p":229900,"e":579200,"l":"B"},{"p":175000,"e":95600,"l":"D"},{"p":499000,"e":542600,"l":"A"},{"p":399900,"e":347500,"l":"B"},{"p":685000,"e":600700,"l":"A"},{"p":649000,"e":697300,"l":"C"},{"p":1299900,"e":519600,"l":"C"},{"p":875000,"e":900800,"l":"A"},{"p":424800,"e":447300,"l":"A"},{"p":249900,"e":259700,"l":"B"},{"p":399000,"e":246200,"l":"C"},{"p":125000,"e":89400,"l":"D"},{"p":799000,"e":767000,"l":"A"},{"p":3750000,"e":3222700,"l":"C"},{"p":398000,"e":337800,"l":"B"},{"p":99000,"e":131100,"l":"C"},{"p":499000,"e":554200,"l":"A"},{"p":399000,"e":242400,"l":"D"},{"p":419000,"e":426800,"l":"B"},{"p":675000,"e":321600,"l":"D"},{"p":2100000,"e":812800,"l":"D"},{"p":795000,"e":451700,"l":"D"},{"p":275000,"e":189000,"l":"C"},{"p":219900,"e":351500,"l":"B"},{"p":349500,"e":215900,"l":"D"},{"p":244900,"e":248400,"l":"C"},{"p":572000,"e":653300,"l":"B"},{"p":585000,"e":622100,"l":"B"},{"p":109900,"e":220300,"l":"D"},{"p":499000,"e":200900,"l":"D"},{"p":975000,"e":918200,"l":"C"},{"p":599000,"e":567100,"l":"A"},{"p":205000,"e":222100,"l":"B"},{"p":530000,"e":525100,"l":"A"},{"p":799000,"e":438000,"l":"C"},{"p":579500,"e":504900,"l":"B"},{"p":259900,"e":272500,"l":"C"},{"p":539900,"e":467000,"l":"C"},{"p":649000,"e":509000,"l":"C"},{"p":439900,"e":441000,"l":"A"},{"p":1579000,"e":1849300,"l":"C"},{"p":1150000,"e":926900,"l":"B"},{"p":844900,"e":799500,"l":"C"},{"p":429900,"e":377700,"l":"B"},{"p":895000,"e":870700,"l":"B"},{"p":539000,"e":569000,"l":"B"},{"p":289000,"e":260400,"l":"B"},{"p":399000,"e":408100,"l":"B"},{"p":269900,"e":337500,"l":"A"},{"p":799000,"e":699700,"l":"C"},{"p":591000,"e":532600,"l":"A"},{"p":414900,"e":595600,"l":"D"},{"p":699000,"e":626700,"l":"C"},{"p":250000,"e":398400,"l":"A"},{"p":385000,"e":343700,"l":"A"},{"p":1195000,"e":1307200,"l":"B"},{"p":199000,"e":147600,"l":"D"},{"p":709900,"e":472000,"l":"A"},{"p":652000,"e":213400,"l":"D"},{"p":239000,"e":739100,"l":"D"},{"p":339000,"e":413800,"l":"B"},{"p":389700,"e":383100,"l":"A"},{"p":449000,"e":598100,"l":"B"},{"p":749000,"e":514300,"l":"B"},{"p":469900,"e":535200,"l":"A"},{"p":149999,"e":236800,"l":"B"},{"p":549900,"e":417200,"l":"C"},{"p":1995000,"e":634400,"l":"D"},{"p":619900,"e":388900,"l":"D"},{"p":199900,"e":263100,"l":"C"},{"p":359900,"e":496000,"l":"A"},{"p":459000,"e":584400,"l":"A"},{"p":559000,"e":705900,"l":"D"},{"p":626000,"e":586500,"l":"A"},{"p":255000,"e":272500,"l":"B"},{"p":349900,"e":397000,"l":"A"},{"p":4350000,"e":2191400,"l":"C"},{"p":465000,"e":416300,"l":"B"},{"p":749900,"e":766200,"l":"B"},{"p":1099000,"e":128100,"l":"D"},{"p":255000,"e":220500,"l":"B"},{"p":3335000,"e":607400,"l":"C"},{"p":1999900,"e":1742800,"l":"C"},{"p":4175000,"e":895900,"l":"C"},{"p":469900,"e":540800,"l":"A"},{"p":207000,"e":1192000,"l":"D"},{"p":599000,"e":592700,"l":"A"},{"p":1089000,"e":1675400,"l":"D"},{"p":10000000,"e":1357600,"l":"D"},{"p":535000,"e":538700,"l":"B"},{"p":459000,"e":916900,"l":"A"},{"p":720000,"e":278700,"l":"C"},{"p":549000,"e":513400,"l":"A"},{"p":380000,"e":518300,"l":"B"},{"p":599900,"e":641800,"l":"A"},{"p":1089000,"e":1297300,"l":"B"},{"p":459000,"e":659500,"l":"C"},{"p":489000,"e":469100,"l":"B"},{"p":899000,"e":900500,"l":"B"},{"p":899000,"e":998100,"l":"C"},{"p":1399000,"e":1268700,"l":"A"},{"p":674900,"e":553600,"l":"B"},{"p":695000,"e":713600,"l":"A"},{"p":525000,"e":1023300,"l":"A"},{"p":549000,"e":621100,"l":"C"},{"p":1599000,"e":732300,"l":"A"},{"p":875000,"e":677400,"l":"A"},{"p":599900,"e":496800,"l":"B"},{"p":999000,"e":426100,"l":"D"},{"p":1079000,"e":1047800,"l":"B"},{"p":538000,"e":439800,"l":"B"},{"p":609000,"e":569100,"l":"B"},{"p":900500,"e":662100,"l":"A"},{"p":3900000,"e":988600,"l":"C"},{"p":849000,"e":789100,"l":"C"},{"p":529000,"e":533800,"l":"C"},{"p":685000,"e":597900,"l":"B"},{"p":629000,"e":639500,"l":"A"},{"p":655000,"e":601200,"l":"A"},{"p":319000,"e":334800,"l":"B"},{"p":450000,"e":465100,"l":"A"},{"p":800000,"e":486600,"l":"C"},{"p":499800,"e":442900,"l":"A"},{"p":269900,"e":350000,"l":"A"},{"p":429900,"e":483000,"l":"A"},{"p":259900,"e":290400,"l":"B"},{"p":349800,"e":456300,"l":"C"},{"p":579000,"e":545100,"l":"A"},{"p":324900,"e":351400,"l":"D"},{"p":449999,"e":456000,"l":"A"},{"p":439000,"e":512200,"l":"B"},{"p":224900,"e":279300,"l":"B"},{"p":599900,"e":714900,"l":"A"},{"p":439600,"e":300900,"l":"C"},{"p":249900,"e":377200,"l":"B"},{"p":959900,"e":701700,"l":"B"},{"p":698800,"e":413400,"l":"C"},{"p":245000,"e":94300,"l":"D"},{"p":479900,"e":390300,"l":"C"},{"p":399900,"e":308100,"l":"C"},{"p":599900,"e":417600,"l":"B"},{"p":498888,"e":510300,"l":"B"},{"p":499777,"e":152800,"l":"D"},{"p":795000,"e":675900,"l":"C"},{"p":799304,"e":583400,"l":"C"},{"p":110000,"e":143600,"l":"C"},{"p":334600,"e":304600,"l":"D"},{"p":544900,"e":411300,"l":"A"},{"p":299955,"e":570400,"l":"C"},{"p":249000,"e":147500,"l":"D"},{"p":1995000,"e":1395800,"l":"B"},{"p":649800,"e":627800,"l":"C"},{"p":699999,"e":622400,"l":"B"},{"p":999000,"e":448600,"l":"B"},{"p":7595000,"e":573300,"l":"B"},{"p":599000,"e":587200,"l":"A"},{"p":599000,"e":563200,"l":"A"},{"p":429900,"e":466400,"l":"A"},{"p":514000,"e":486500,"l":"A"},{"p":445000,"e":446400,"l":"A"},{"p":989000,"e":1133400,"l":"D"},{"p":485000,"e":479100,"l":"B"},{"p":549000,"e":561400,"l":"A"},{"p":499900,"e":506600,"l":"B"},{"p":989000,"e":869300,"l":"A"},{"p":429000,"e":442300,"l":"A"},{"p":525000,"e":524500,"l":"A"},{"p":624900,"e":494000,"l":"C"},{"p":349000,"e":263400,"l":"B"},{"p":989000,"e":768800,"l":"B"},{"p":629000,"e":478400,"l":"B"},{"p":950000,"e":779400,"l":"B"},{"p":2799000,"e":833000,"l":"D"},{"p":419000,"e":477100,"l":"C"},{"p":489000,"e":317900,"l":"D"},{"p":599900,"e":446600,"l":"D"},{"p":2495000,"e":506700,"l":"C"},{"p":729000,"e":527900,"l":"C"},{"p":465000,"e":214700,"l":"C"},{"p":2249000,"e":799800,"l":"D"},{"p":250000,"e":514900,"l":"B"},{"p":354900,"e":366000,"l":"A"},{"p":290000,"e":136400,"l":"D"},{"p":334000,"e":209600,"l":"D"},{"p":1495000,"e":112400,"l":"D"},{"p":319000,"e":263600,"l":"D"},{"p":468500,"e":443200,"l":"A"},{"p":495000,"e":567400,"l":"B"},{"p":619500,"e":620600,"l":"B"},{"p":549000,"e":358600,"l":"C"},{"p":390000,"e":369800,"l":"A"},{"p":1599000,"e":632800,"l":"B"},{"p":1650000,"e":982000,"l":"C"},{"p":395000,"e":768200,"l":"C"},{"p":1299900,"e":1246800,"l":"B"},{"p":299000,"e":5849800,"l":"D"},{"p":408746,"e":581700,"l":"A"},{"p":625000,"e":267000,"l":"D"},{"p":714900,"e":507700,"l":"A"},{"p":2249000,"e":1040800,"l":"A"},{"p":995000,"e":474500,"l":"B"},{"p":1189000,"e":511400,"l":"C"},{"p":1150000,"e":2403900,"l":"D"},{"p":1400000,"e":450200,"l":"C"},{"p":1750000,"e":1016900,"l":"C"},{"p":255000,"e":1192000,"l":"D"},{"p":419000,"e":892500,"l":"A"},{"p":1295000,"e":527600,"l":"A"},{"p":1150000,"e":970600,"l":"B"},{"p":415000,"e":595100,"l":"A"},{"p":699000,"e":684400,"l":"B"},{"p":1250000,"e":733700,"l":"B"},{"p":459000,"e":432500,"l":"A"},{"p":200000,"e":1192000,"l":"D"},{"p":329000,"e":282600,"l":"B"},{"p":390000,"e":451800,"l":"B"},{"p":949000,"e":569000,"l":"B"},{"p":372900,"e":381700,"l":"A"},{"p":268000,"e":712100,"l":"A"},{"p":299990,"e":415000,"l":"B"},{"p":599999,"e":623600,"l":"A"},{"p":3699000,"e":1087900,"l":"D"},{"p":575000,"e":823300,"l":"B"},{"p":799000,"e":761700,"l":"A"},{"p":94900,"e":1182900,"l":"D"},{"p":1299000,"e":1107200,"l":"B"},{"p":939900,"e":276900,"l":"D"},{"p":399000,"e":385400,"l":"A"},{"p":799000,"e":738400,"l":"B"},{"p":499900,"e":453200,"l":"A"},{"p":324900,"e":327100,"l":"B"},{"p":699900,"e":688600,"l":"A"},{"p":424900,"e":235600,"l":"D"},{"p":1549000,"e":1070000,"l":"B"},{"p":579900,"e":572600,"l":"A"},{"p":589000,"e":497000,"l":"D"},{"p":675000,"e":544300,"l":"B"},{"p":539900,"e":614800,"l":"A"},{"p":439000,"e":430300,"l":"A"},{"p":539900,"e":543800,"l":"A"},{"p":729900,"e":532300,"l":"A"},{"p":624900,"e":543900,"l":"B"},{"p":649900,"e":606100,"l":"A"},{"p":1095000,"e":1371000,"l":"B"},{"p":399900,"e":480400,"l":"A"},{"p":675000,"e":424600,"l":"B"},{"p":298000,"e":432300,"l":"B"},{"p":649900,"e":474100,"l":"D"},{"p":369900,"e":370900,"l":"A"},{"p":939000,"e":853700,"l":"A"},{"p":399000,"e":448500,"l":"A"},{"p":975000,"e":563200,"l":"B"},{"p":75000,"e":281000,"l":"D"},{"p":445000,"e":514100,"l":"B"},{"p":499000,"e":543100,"l":"C"},{"p":599900,"e":503200,"l":"C"},{"p":344900,"e":379100,"l":"B"},{"p":549000,"e":441500,"l":"B"},{"p":699000,"e":608700,"l":"A"},{"p":729900,"e":654700,"l":"B"},{"p":2595000,"e":8618000,"l":"D"},{"p":249000,"e":279200,"l":"C"},{"p":749900,"e":696700,"l":"A"},{"p":583000,"e":530000,"l":"A"},{"p":330000,"e":215300,"l":"C"},{"p":539800,"e":624200,"l":"A"},{"p":367900,"e":404600,"l":"A"},{"p":489000,"e":266800,"l":"D"},{"p":559000,"e":549800,"l":"C"},{"p":499000,"e":483400,"l":"A"},{"p":278000,"e":375300,"l":"B"},{"p":354000,"e":500300,"l":"A"},{"p":625000,"e":730500,"l":"C"},{"p":379000,"e":468000,"l":"A"},{"p":549000,"e":553900,"l":"A"},{"p":299900,"e":227500,"l":"B"},{"p":1090000,"e":592000,"l":"A"},{"p":1195000,"e":765700,"l":"D"},{"p":515000,"e":562000,"l":"A"},{"p":1150000,"e":706300,"l":"B"},{"p":149000,"e":206000,"l":"C"},{"p":524900,"e":478100,"l":"B"},{"p":410000,"e":464700,"l":"A"},{"p":1099000,"e":1070600,"l":"C"},{"p":569900,"e":618100,"l":"B"},{"p":449999,"e":503700,"l":"A"},{"p":429000,"e":270000,"l":"C"},{"p":314000,"e":315100,"l":"C"},{"p":549900,"e":570200,"l":"A"},{"p":469000,"e":500000,"l":"B"},{"p":199000,"e":338500,"l":"C"},{"p":699500,"e":519700,"l":"A"},{"p":375000,"e":827600,"l":"D"},{"p":429900,"e":484300,"l":"D"},{"p":434000,"e":270700,"l":"D"},{"p":474500,"e":467200,"l":"A"},{"p":359000,"e":499800,"l":"C"},{"p":435000,"e":497600,"l":"A"},{"p":1150000,"e":565800,"l":"C"},{"p":399900,"e":390800,"l":"A"},{"p":795000,"e":209400,"l":"D"},{"p":475000,"e":451400,"l":"A"},{"p":230000,"e":225700,"l":"B"},{"p":10235000,"e":1632500,"l":"D"},{"p":5450000,"e":1741800,"l":"D"},{"p":3400000,"e":2593900,"l":"D"},{"p":2350000,"e":905700,"l":"C"},{"p":1850000,"e":1441200,"l":"C"},{"p":1485000,"e":1022600,"l":"B"},{"p":1150000,"e":1065600,"l":"A"},{"p":919900,"e":1092600,"l":"C"},{"p":799000,"e":573500,"l":"C"},{"p":560000,"e":562100,"l":"B"},{"p":275000,"e":288700,"l":"C"},{"p":1150000,"e":1455100,"l":"C"},{"p":4800000,"e":1085700,"l":"C"},{"p":1425000,"e":641200,"l":"C"},{"p":849000,"e":801400,"l":"A"},{"p":229000,"e":258800,"l":"B"},{"p":515000,"e":411300,"l":"A"},{"p":699900,"e":561000,"l":"B"},{"p":534900,"e":509600,"l":"B"},{"p":395000,"e":447600,"l":"B"},{"p":449000,"e":508900,"l":"B"},{"p":350000,"e":252600,"l":"D"},{"p":700000,"e":626500,"l":"A"},{"p":1149000,"e":1055700,"l":"C"},{"p":489000,"e":681100,"l":"B"},{"p":999000,"e":901500,"l":"C"},{"p":449000,"e":264200,"l":"B"},{"p":399000,"e":908100,"l":"B"},{"p":424900,"e":588500,"l":"B"},{"p":565000,"e":519900,"l":"A"},{"p":375000,"e":407200,"l":"C"},{"p":599000,"e":1344200,"l":"C"},{"p":419900,"e":426100,"l":"A"},{"p":400000,"e":524300,"l":"B"},{"p":599000,"e":610600,"l":"A"},{"p":475000,"e":536900,"l":"A"},{"p":409000,"e":354500,"l":"D"},{"p":549000,"e":659900,"l":"A"},{"p":824440,"e":430600,"l":"D"},{"p":399987,"e":573500,"l":"A"},{"p":850000,"e":659500,"l":"C"},{"p":350000,"e":353300,"l":"B"},{"p":454000,"e":553100,"l":"A"},{"p":707023,"e":429800,"l":"D"},{"p":699000,"e":639800,"l":"B"},{"p":499000,"e":467800,"l":"A"},{"p":459000,"e":519700,"l":"A"},{"p":2000000,"e":622000,"l":"A"},{"p":198500,"e":114500,"l":"C"},{"p":650000,"e":547100,"l":"A"},{"p":2000000,"e":939600,"l":"B"},{"p":1350000,"e":802900,"l":"C"},{"p":449000,"e":974100,"l":"C"},{"p":675000,"e":331600,"l":"B"},{"p":299900,"e":239600,"l":"C"},{"p":483600,"e":504400,"l":"B"},{"p":979000,"e":963400,"l":"B"},{"p":1150000,"e":502300,"l":"B"},{"p":1760000,"e":976900,"l":"D"},{"p":1279000,"e":967900,"l":"A"},{"p":814900,"e":994000,"l":"B"},{"p":699900,"e":521800,"l":"A"},{"p":659000,"e":718900,"l":"A"},{"p":300000,"e":296800,"l":"B"},{"p":319000,"e":498200,"l":"A"},{"p":425000,"e":428600,"l":"C"},{"p":375000,"e":408600,"l":"A"},{"p":1698000,"e":1053500,"l":"B"},{"p":1090000,"e":854000,"l":"C"},{"p":389000,"e":380700,"l":"A"},{"p":295000,"e":173500,"l":"C"},{"p":649000,"e":580700,"l":"B"},{"p":756000,"e":783600,"l":"A"},{"p":449000,"e":369000,"l":"D"},{"p":435000,"e":399900,"l":"C"},{"p":399000,"e":712400,"l":"B"},{"p":579000,"e":545100,"l":"B"},{"p":329000,"e":342300,"l":"B"},{"p":350000,"e":549200,"l":"A"},{"p":439000,"e":437400,"l":"A"},{"p":819000,"e":962300,"l":"B"},{"p":739000,"e":761400,"l":"A"},{"p":425000,"e":471500,"l":"B"},{"p":419000,"e":570800,"l":"B"},{"p":359000,"e":454000,"l":"B"},{"p":675000,"e":772100,"l":"B"},{"p":535000,"e":552900,"l":"A"},{"p":559900,"e":561500,"l":"A"},{"p":450000,"e":161600,"l":"D"},{"p":469000,"e":472300,"l":"A"},{"p":349500,"e":446500,"l":"B"},{"p":599900,"e":579100,"l":"A"},{"p":549000,"e":370200,"l":"D"},{"p":1279000,"e":967900,"l":"A"},{"p":441935,"e":372900,"l":"C"},{"p":1500000,"e":1052600,"l":"B"},{"p":319999,"e":219700,"l":"D"},{"p":389900,"e":428100,"l":"A"},{"p":725000,"e":619900,"l":"B"},{"p":1350000,"e":916300,"l":"B"},{"p":699000,"e":866900,"l":"A"},{"p":499900,"e":594900,"l":"B"},{"p":739900,"e":717000,"l":"A"},{"p":299900,"e":271400,"l":"D"},{"p":425000,"e":382700,"l":"D"},{"p":649000,"e":665800,"l":"B"},{"p":299000,"e":484100,"l":"C"},{"p":424900,"e":350000,"l":"A"},{"p":455000,"e":355300,"l":"B"},{"p":695000,"e":599000,"l":"A"},{"p":474900,"e":544200,"l":"A"},{"p":479000,"e":425700,"l":"A"},{"p":259000,"e":236800,"l":"B"},{"p":299000,"e":341600,"l":"C"},{"p":599000,"e":716700,"l":"A"},{"p":499000,"e":446700,"l":"B"},{"p":779900,"e":352900,"l":"C"},{"p":550000,"e":546100,"l":"C"},{"p":799000,"e":1417700,"l":"C"},{"p":475000,"e":515200,"l":"A"},{"p":259000,"e":195700,"l":"C"},{"p":710000,"e":687900,"l":"A"},{"p":539900,"e":528600,"l":"A"},{"p":859000,"e":686500,"l":"B"},{"p":1195000,"e":981700,"l":"A"},{"p":624900,"e":567500,"l":"B"},{"p":689900,"e":698500,"l":"A"}]}
\ No newline at end of file
2