phony 1.9.0 → 2.19.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/README.textile +64 -112
  3. data/lib/phony/config.rb +91 -0
  4. data/lib/phony/countries/argentina.rb +355 -0
  5. data/lib/phony/countries/austria.rb +56 -22
  6. data/lib/phony/countries/bangladesh.rb +57 -0
  7. data/lib/phony/countries/belarus.rb +133 -0
  8. data/lib/phony/countries/brazil.rb +101 -95
  9. data/lib/phony/countries/cambodia.rb +131 -0
  10. data/lib/phony/countries/china.rb +13 -6
  11. data/lib/phony/countries/croatia.rb +23 -0
  12. data/lib/phony/countries/georgia.rb +94 -0
  13. data/lib/phony/countries/germany.rb +66 -42
  14. data/lib/phony/countries/guinea.rb +46 -0
  15. data/lib/phony/countries/india.rb +50 -0
  16. data/lib/phony/countries/indonesia.rb +55 -0
  17. data/lib/phony/countries/ireland.rb +35 -28
  18. data/lib/phony/countries/italy.rb +272 -166
  19. data/lib/phony/countries/japan.rb +468 -0
  20. data/lib/phony/countries/kyrgyzstan.rb +120 -0
  21. data/lib/phony/countries/latvia.rb +43 -0
  22. data/lib/phony/countries/libya.rb +116 -0
  23. data/lib/phony/countries/malaysia.rb +31 -7
  24. data/lib/phony/countries/moldova.rb +53 -0
  25. data/lib/phony/countries/montenegro.rb +30 -0
  26. data/lib/phony/countries/myanmar.rb +55 -0
  27. data/lib/phony/countries/namibia.rb +37 -0
  28. data/lib/phony/countries/nepal.rb +73 -0
  29. data/lib/phony/countries/netherlands.rb +17 -5
  30. data/lib/phony/countries/pakistan.rb +121 -0
  31. data/lib/phony/countries/paraguay.rb +147 -0
  32. data/lib/phony/countries/{russia_kazakhstan_abhasia_south_osetia.rb → russia_kazakhstan_abkhasia_south_ossetia.rb} +35 -24
  33. data/lib/phony/countries/saudi_arabia.rb +40 -0
  34. data/lib/phony/countries/serbia.rb +47 -0
  35. data/lib/phony/countries/somalia.rb +26 -0
  36. data/lib/phony/countries/south_korea.rb +19 -10
  37. data/lib/phony/countries/sweden.rb +58 -38
  38. data/lib/phony/countries/taiwan.rb +28 -0
  39. data/lib/phony/countries/tajikistan.rb +79 -0
  40. data/lib/phony/countries/turkmenistan.rb +76 -0
  41. data/lib/phony/countries/ukraine.rb +630 -0
  42. data/lib/phony/countries/united_kingdom.rb +639 -44
  43. data/lib/phony/countries/uruguay.rb +53 -0
  44. data/lib/phony/countries/vietnam.rb +133 -0
  45. data/lib/phony/countries/zimbabwe.rb +39 -0
  46. data/lib/phony/countries.rb +901 -301
  47. data/lib/phony/country.rb +177 -20
  48. data/lib/phony/country_codes.rb +119 -101
  49. data/lib/phony/dsl.rb +113 -68
  50. data/lib/phony/local_splitters/fixed.rb +25 -1
  51. data/lib/phony/local_splitters/regex.rb +16 -2
  52. data/lib/phony/national_code.rb +7 -7
  53. data/lib/phony/national_splitters/default.rb +35 -3
  54. data/lib/phony/national_splitters/dsl.rb +12 -7
  55. data/lib/phony/national_splitters/fixed.rb +7 -1
  56. data/lib/phony/national_splitters/none.rb +7 -3
  57. data/lib/phony/national_splitters/regex.rb +6 -0
  58. data/lib/phony/national_splitters/variable.rb +13 -9
  59. data/lib/phony/trunk_code.rb +57 -0
  60. data/lib/phony/vanity.rb +3 -3
  61. data/lib/phony.rb +239 -55
  62. data/spec/functional/config_spec.rb +44 -0
  63. data/spec/functional/plausibility_spec.rb +656 -0
  64. data/spec/lib/phony/countries_spec.rb +1207 -119
  65. data/spec/lib/phony/country_codes_spec.rb +99 -81
  66. data/spec/lib/phony/country_spec.rb +54 -14
  67. data/spec/lib/phony/dsl_spec.rb +2 -2
  68. data/spec/lib/phony/local_splitters/fixed_spec.rb +4 -4
  69. data/spec/lib/phony/local_splitters/regex_spec.rb +50 -2
  70. data/spec/lib/phony/national_code_spec.rb +34 -34
  71. data/spec/lib/phony/national_splitters/default_spec.rb +34 -0
  72. data/spec/lib/phony/national_splitters/fixed_spec.rb +12 -6
  73. data/spec/lib/phony/national_splitters/none_spec.rb +13 -3
  74. data/spec/lib/phony/national_splitters/regex_spec.rb +1 -1
  75. data/spec/lib/phony/national_splitters/variable_spec.rb +11 -5
  76. data/spec/lib/phony/trunk_code_spec.rb +85 -0
  77. data/spec/lib/phony/vanity_spec.rb +15 -19
  78. data/spec/lib/phony_spec.rb +59 -277
  79. metadata +67 -34
  80. data/lib/phony/validator.rb +0 -26
  81. data/lib/phony/validators.rb +0 -88
  82. data/spec/lib/phony/validations_spec.rb +0 -109
@@ -1,22 +1,46 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Malaysian phone numbers.
2
4
  #
3
5
  # http://en.wikipedia.org/wiki/Telephone_numbers_in_Malaysia
4
6
  #
5
7
  ndcs = [
6
8
  '2', # Singapore
7
- '3', # Selangor & Federal Territories of Kuala Lumpur & Putrajaya & also Genting Highlands, Pahang
8
9
  '4', # Kedah, Penang & Perlis
9
10
  '5', # Perak & Cameron Highlands (Pahang)
10
11
  '6', # Melaka, Negeri Sembilan & Muar (Johor)
11
12
  '7', # Johor (except Muar)
12
13
  '9', # Kelantan, Pahang (except Cameron Highlands & Genting Highlands) & Terengganu
13
14
  ]
15
+
16
+ ndcs_two_digits = [
17
+ '80', # Domestic access code from East Malaysia to Brunei
18
+ '81', # Reserved number for future use
19
+ '82', # Sarawak – Kuching, Samarahan and Serian
20
+ '83', # Sarawak – Sri Aman and Betong
21
+ '84', # Sarawak – Sibu, Sarikei, Mukah and Kapit
22
+ '85', # Sarawak – Miri, Limbang and Lawas
23
+ '86', # Sarawak – Bintulu and Belaga
24
+ '87', # Labuan Interior Division, Sabah
25
+ '88', # Sabah – Kota Kinabalu and Kudat
26
+ '89', # Sabah – Lahad Datu, Sandakan and Tawau
27
+ ]
28
+
14
29
  mobile = %w{ 10 11 12 13 14 153 154 156 158 16 17 18 19 }
15
- service = %w{ 100 101 102 103 104 108 112 991 994 995 999 }
30
+ # service = %w{ 100 101 102 103 104 108 991 994 995 999 } # Emergeny and Service numbers, only 3 digits long
31
+ freephone = %w{ 300 700 800 }
32
+ ndcs_eight = [
33
+ '3' # Selangor & Federal Territories of Kuala Lumpur & Putrajaya & also Genting Highlands, Pahang
34
+ ]
16
35
 
17
36
  Phony.define do
18
- country '60', one_of(service) >> split(3,3) | # Service
19
- one_of(mobile) >> split(8) | # Mobile
20
- one_of(ndcs) >> split(8) | # 1-digit NDCs
21
- fixed(2) >> split(8) # 2-digit NDCs (Also, fallback)
22
- end
37
+ country '60',
38
+ trunk('0') |
39
+ one_of(freephone) >> split(2,4) | # Freephone, Tollfree, Forwarding
40
+ # one_of(service) >> none | # Service
41
+ one_of(mobile) >> split(3,4..5) | # Mobile
42
+ one_of(ndcs_two_digits) >> split(6) | # 2-digit NDCs
43
+ one_of(ndcs) >> split(7) | # 1-digit NDCs
44
+ one_of(ndcs_eight) >> split(8) | # 1-digit NDCs
45
+ fixed(2) >> split(8) # 2-digit NDCs (Also, fallback)
46
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Moldova
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=MD
6
+
7
+ ndcs_with_6_subscriber_numbers = %w(22)
8
+ ndcs_with_5_subscriber_numbers = %w(
9
+ 230
10
+ 231
11
+ 235
12
+ 236
13
+ 237
14
+ 241
15
+ 242
16
+ 243
17
+ 244
18
+ 246
19
+ 247
20
+ 248
21
+ 249
22
+ 250
23
+ 251
24
+ 252
25
+ 254
26
+ 256
27
+ 258
28
+ 259
29
+ 262
30
+ 263
31
+ 264
32
+ 265
33
+ 268
34
+ 269
35
+ 271
36
+ 272
37
+ 273
38
+ 277
39
+ 291
40
+ 293
41
+ 294
42
+ 297
43
+ 298
44
+ 299
45
+ )
46
+
47
+ Phony.define do
48
+ country '373',
49
+ trunk('0') |
50
+ one_of(ndcs_with_5_subscriber_numbers) >> split(3,2) |
51
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) |
52
+ fixed(3) >> split(3,2)
53
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Montenegro
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=ME
6
+
7
+ Phony.define do
8
+ country '382',
9
+ trunk('0') |
10
+ one_of(%w(80)) >> split(3,3) | # freephone
11
+ one_of(%w(20 30 31 40 52)) >> matched_split(
12
+ /\A\d{5}\z/ => [3,2],
13
+ /\A\d+\z/ => [3,3]) |
14
+ one_of(%w(32 33 50 51)) >> split(3,3) |
15
+ one_of(%w(77)) >> split(3,3) | # national geographic
16
+ one_of(%w(78)) >> split(3,3) | # VoIP telephony
17
+ one_of(%w(88)) >> split(3,3) | # shared cost
18
+ one_of(%w(94 95)) >> split(3,3) | # premium rate
19
+ one_of(%w(63 67 69 70)) >> matched_split(
20
+ /\A\d{3}\z/ => [3],
21
+ /\A\d{6}\z/ => [3,3],
22
+ /\A\d+\z/ => [3,3,4]) | # mobile, voicemail (mobile
23
+ one_of(%w(68)) >> matched_split(
24
+ /\A\d{2}\z/ => [2],
25
+ /\A\d{6}\z/ => [3,3],
26
+ /\A\d+\z/ => [2,4,4]) | # voicemail (mobile)
27
+ fixed(2) >> matched_split(
28
+ /\A\d{5}\z/ => [3,2],
29
+ /\A\d+\z/ => [3,3])
30
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Myanmar: http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000920003PDFE.pdf
4
+ #
5
+ # formatting according to Google's libphonenumber library. (r680 7/30/2014)
6
+ # except for ANEE SAKHAN area, Yangon ZTE GSM, MEC Tel CDMA 800 Mhz which are
7
+ # not correctly handled by the google library
8
+
9
+ area_codes = [
10
+ '1',
11
+ '2',
12
+ '42',
13
+ '43',
14
+ '44',
15
+ '45',
16
+ '46',
17
+ '52',
18
+ '53',
19
+ '54',
20
+ '57',
21
+ '58',
22
+ '59',
23
+ '61',
24
+ '62',
25
+ '64',
26
+ '65',
27
+ '66',
28
+ '67',
29
+ '69',
30
+ '70',
31
+ '71',
32
+ '72',
33
+ '73',
34
+ '75',
35
+ '81',
36
+ '82',
37
+ '83',
38
+ '84',
39
+ '85',
40
+ '86'
41
+ ]
42
+
43
+ Phony.define do
44
+ country '95',
45
+ one_of(area_codes) >> matched_split(
46
+ /\A\d{5}\z/ => [2,3],
47
+ /\A\d{6}\z/ => [3,3],
48
+ /\A\d{7}\z/ => [3,4]
49
+ ) |
50
+ one_of('9') >> matched_split( # mobile operators
51
+ /\A\d{7}\z/ => [3,4],
52
+ /\A\d{8}\z/ => [4,4],
53
+ /\A\d{9}\z/ => [3,3,3]
54
+ )
55
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Namibia
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=NA
6
+
7
+ Phony.define do
8
+ country '264',
9
+ one_of(%w(632532)) >> split(4) |
10
+ one_of(%w(6342)) >> matched_split(
11
+ /\A\d{3}\z/ => [3],
12
+ /\A\d+\z/ => [3,3]) |
13
+ one_of(%w(6362 6638)) >> split(4) |
14
+ one_of(%w(6642)) >> matched_split(
15
+ /\A\d{4}\z/ => [4],
16
+ /\A\d+\z/ => [3,3]) |
17
+ one_of(%w(6751)) >> split(3,2) |
18
+ one_of(%w(628)) >> split(4) |
19
+ one_of(%w(658)) >> split(5) |
20
+ one_of(%w(668)) >> matched_split(
21
+ /\A\d{4}\z/ => [4],
22
+ /\A\d{5}\z/ => [3,2],
23
+ /\A\d+\z/ => [3,3]) |
24
+ one_of(%w(61 63 64 65 67)) >> matched_split(
25
+ /\A\d{6}\z/ => [3,3],
26
+ /\A\d+\z/ => [3,3,3]) |
27
+ one_of(%w(66)) >> matched_split(
28
+ /\A\d{4}\z/ => [4],
29
+ /\A\d+\z/ => [3,3]) |
30
+ one_of(%w(62)) >> split(3,3) |
31
+ one_of(%w(67)) >> matched_split(
32
+ /\A\d{6}\z/ => [3,3],
33
+ /\A\d{7}\z/ => [4,3],
34
+ /\A\d+\z/ => [3,3,3]) |
35
+ one_of(%w(60 81 82 83 85)) >> split(4,3) |
36
+ fixed(2) >> split(3,3)
37
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Nepal
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=NP
6
+
7
+ ndcs_with_7_subscriber_digits = %w(1)
8
+
9
+ ndcs_with_6_subscriber_digits = %w(
10
+ 10
11
+ 11
12
+ 21
13
+ 23
14
+ 24
15
+ 25
16
+ 26
17
+ 27
18
+ 29
19
+ 31
20
+ 33
21
+ 35
22
+ 36
23
+ 37
24
+ 38
25
+ 41
26
+ 44
27
+ 46
28
+ 47
29
+ 49
30
+ 51
31
+ 53
32
+ 55
33
+ 56
34
+ 57
35
+ 61
36
+ 63
37
+ 64
38
+ 66
39
+ 67
40
+ 68
41
+ 69
42
+ 71
43
+ 75
44
+ 76
45
+ 77
46
+ 78
47
+ 79
48
+ 81
49
+ 82
50
+ 83
51
+ 84
52
+ 86
53
+ 87
54
+ 89
55
+ 91
56
+ 92
57
+ 93
58
+ 94
59
+ 95
60
+ 96
61
+ 97
62
+ 99
63
+ )
64
+
65
+ Phony.define do
66
+ country '977',
67
+ one_of(ndcs_with_6_subscriber_digits) >> split(3,3) |
68
+ one_of(%w(98)) >> split(4,4) | # mobile
69
+ one_of(ndcs_with_7_subscriber_digits) >> split(3,4) |
70
+ fixed(2) >> split(3,3)
71
+ end
72
+
73
+
@@ -1,4 +1,7 @@
1
- # The Netherlands use a variable-length ndc code, thus we use a separate file to not let all_other.rb explode.
1
+ # frozen_string_literal: true
2
+
3
+ # The Netherlands use a variable-length ndc code, thus we use a separate file to not let all_other.rb explode. The
4
+ # latest version of the numbering plan is available at http://wetten.overheid.nl/BWBR0010198/
2
5
  #
3
6
  # Note: The netherlands use a variable ndc format from length 2 to 3.
4
7
  # To save space, we only use ndcs of length 2 (and use the fallback of 3 to handle the rest).
@@ -43,6 +46,9 @@ service = [
43
46
  '87', # Both of the above.
44
47
  '88', # Bedrijfsnummers
45
48
  '91', # Plaatsonafhankelijk netnummer
49
+ ]
50
+
51
+ service3 = [
46
52
  '676', # Inbelnummers van Internetproviders
47
53
  '800', # Gratis informatienummers
48
54
  '900', # Betaalde informatienummers
@@ -51,7 +57,13 @@ service = [
51
57
  ]
52
58
 
53
59
  Phony.define do
54
- country '31', one_of(service) >> split(3,3) |
55
- one_of(['6'] + ndcs) >> split(8) | # mobile + landline
56
- fixed(3) >> split(8) # 8 is for mobile numbers, other numbers will work as well (they use 7).
57
- end
60
+ country '31',
61
+ trunk('0', :normalize => true) |
62
+ match(/\A(97[0,9])\d{8}\z/) >> split(4,4) | # machine-to-machine
63
+ one_of(service) >> split(4,3) |
64
+ match(/\A(800|900)\d{4}\z/) >> split(4) |
65
+ one_of(service3) >> split(4,3) |
66
+ one_of('6') >> split(2,2,2,2) | # mobile
67
+ one_of(ndcs) >> split(3,4) | # landline (geographic region)
68
+ fixed(3) >> split(3,3) # 3 digit ndc
69
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pakistan (Islamic Republic of)
4
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=PK
5
+
6
+ ndcs_with_8_subscriber_numbers = %w(21 42 58)
7
+
8
+ ndcs_with_7_subscriber_numbers = %w(
9
+ 22
10
+ 25
11
+ 40
12
+ 41
13
+ 44
14
+ 46
15
+ 47
16
+ 48
17
+ 49
18
+ 51
19
+ 52
20
+ 53
21
+ 55
22
+ 56
23
+ 57
24
+ 61
25
+ 62
26
+ 63
27
+ 64
28
+ 65
29
+ 66
30
+ 67
31
+ 68
32
+ 71
33
+ 74
34
+ 81
35
+ 86
36
+ 91
37
+ )
38
+
39
+ ndcs_with_6_subscriber_numbers = %w(
40
+ 232
41
+ 233
42
+ 235
43
+ 238
44
+ 242
45
+ 243
46
+ 244
47
+ 297
48
+ 298
49
+ 453
50
+ 454
51
+ 457
52
+ 459
53
+ 542
54
+ 543
55
+ 544
56
+ 546
57
+ 547
58
+ 604
59
+ 606
60
+ 608
61
+ 722
62
+ 723
63
+ 726
64
+ 822
65
+ 823
66
+ 824
67
+ 825
68
+ 826
69
+ 828
70
+ 829
71
+ 832
72
+ 833
73
+ 835
74
+ 837
75
+ 838
76
+ 843
77
+ 844
78
+ 847
79
+ 848
80
+ 852
81
+ 853
82
+ 855
83
+ 856
84
+ 922
85
+ 923
86
+ 924
87
+ 925
88
+ 926
89
+ 927
90
+ 928
91
+ 932
92
+ 937
93
+ 938
94
+ 939
95
+ 942
96
+ 943
97
+ 944
98
+ 945
99
+ 946
100
+ 963
101
+ 965
102
+ 966
103
+ 969
104
+ 992
105
+ 995
106
+ 996
107
+ 997
108
+ 998
109
+ )
110
+
111
+ Phony.define do
112
+
113
+ country '92',
114
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) |
115
+ one_of('122') >> split(3,3) | # universal access
116
+ one_of(ndcs_with_7_subscriber_numbers) >> split(4,3) |
117
+ one_of(ndcs_with_8_subscriber_numbers) >> split(4,4) |
118
+ one_of(%w(30 31 32 33 34 35 36)) >> split(4,4) | # mobile
119
+ fixed(2) >> split(4,4)
120
+
121
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Paraguay (Republic of)
4
+ # https://www.numberingplans.com/?page=dialling&sub=areacodes
5
+ # https://www.numberingplans.com/?page=plans&sub=phonenr&alpha_2_input=PY
6
+
7
+ ndcs_with_6_7_subscriber_numbers = %w(
8
+ 21
9
+ 24
10
+ 25
11
+ 26
12
+ 28
13
+ 31
14
+ 32
15
+ 33
16
+ 36
17
+ 37
18
+ 38
19
+ 39
20
+ 41
21
+ 42
22
+ 43
23
+ 44
24
+ 46
25
+ 47
26
+ 48
27
+ 61
28
+ 71
29
+ 72
30
+ 73
31
+ 75
32
+ 81
33
+ 82
34
+ 83
35
+ 86
36
+ 91
37
+ 92
38
+ 93
39
+ 94
40
+ )
41
+
42
+ ndcs_with_6_subscriber_numbers = %w(
43
+ 271
44
+ 275
45
+ 291
46
+ 292
47
+ 293
48
+ 294
49
+ 295
50
+ 345
51
+ 351
52
+ 418
53
+ 451
54
+ 453
55
+ 464
56
+ 511
57
+ 512
58
+ 513
59
+ 514
60
+ 515
61
+ 516
62
+ 517
63
+ 518
64
+ 519
65
+ 520
66
+ 521
67
+ 522
68
+ 523
69
+ 524
70
+ 527
71
+ 528
72
+ 529
73
+ 531
74
+ 532
75
+ 533
76
+ 534
77
+ 535
78
+ 536
79
+ 537
80
+ 538
81
+ 539
82
+ 541
83
+ 542
84
+ 544
85
+ 545
86
+ 546
87
+ 547
88
+ 548
89
+ 549
90
+ 550
91
+ 552
92
+ 553
93
+ 554
94
+ 631
95
+ 632
96
+ 633
97
+ 644
98
+ 671
99
+ 672
100
+ 673
101
+ 674
102
+ 675
103
+ 676
104
+ 677
105
+ 678
106
+ 717
107
+ 718
108
+ 740
109
+ 741
110
+ 742
111
+ 743
112
+ 761
113
+ 762
114
+ 763
115
+ 764
116
+ 767
117
+ 768
118
+ 780
119
+ 781
120
+ 782
121
+ 783
122
+ 784
123
+ 785
124
+ 787
125
+ 858
126
+ 871
127
+ 873
128
+ 918
129
+ 951
130
+ 952
131
+ )
132
+
133
+ Phony.define do
134
+
135
+ country '595',
136
+ one_of(ndcs_with_6_subscriber_numbers) >> split(3,3) | # geographic
137
+ one_of(ndcs_with_6_7_subscriber_numbers) >>
138
+ matched_split(
139
+ /\A\d{6}\z/ => [3,3],
140
+ /\A\d+\z/ => [3,4]) | # geographic
141
+ one_of(%w(96 97 98 99)) >> split(3,4) | # mobile
142
+ fixed(2) >>
143
+ matched_split(
144
+ /\A\d{6}\z/ => [3,3],
145
+ /\A\d+\z/ => [3,4])
146
+
147
+ end