codice_fiscale 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,199 @@
1
+ #--
2
+ # Copyleft shura. [shura1991@gmail.com]
3
+ #
4
+ # This file is part of codice_fiscale.
5
+ #
6
+ # codice_fiscale is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # codice_fiscale is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with codice_fiscale. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ class CodiceFiscale < String
21
+ VERSION = '0.1'
22
+
23
+ MONTH = [nil, ?A, ?B, ?C, ?D, ?E, ?H, ?L, ?M, ?P, ?R, ?S, ?T]
24
+
25
+ ALFANUM_TO_CODE = {
26
+ odd: {
27
+ ?0 => 1, ?1 => 0, ?2 => 5, ?3 => 7, ?4 => 9,
28
+ ?5 => 13, ?6 => 15, ?7 => 17, ?8 => 19, ?9 => 21,
29
+ ?A => 1, ?B => 0, ?C => 5, ?D => 7, ?E => 9,
30
+ ?F => 13, ?G => 15, ?H => 17, ?I => 19, ?J => 21,
31
+ ?K => 2, ?L => 4, ?M => 18, ?N => 20, ?O => 11,
32
+ ?P => 3, ?Q => 6, ?R => 8, ?S => 12, ?T => 14,
33
+ ?U => 16, ?V => 10, ?W => 22, ?X => 25,
34
+ ?Y => 24, ?Z => 23
35
+ },
36
+ even: {
37
+ ?0 => 0, ?1 => 1, ?2 => 2, ?3 => 3, ?4 => 4,
38
+ ?5 => 5, ?6 => 6, ?7 => 7, ?8 => 8, ?9 => 9,
39
+ ?A => 0, ?B => 1, ?C => 2, ?D => 3, ?E => 4,
40
+ ?F => 5, ?G => 6, ?H => 7, ?I => 8, ?J => 9,
41
+ ?K => 10, ?L => 11, ?M => 12, ?N => 13, ?O => 14,
42
+ ?P => 15, ?Q => 16, ?R => 17, ?S => 18, ?T => 19,
43
+ ?U => 20, ?V => 21, ?W => 22, ?X => 23, ?Y => 24,
44
+ ?Z => 25
45
+ }
46
+ }
47
+
48
+ ALTERNATIVE = {
49
+ ?0 => ?L, ?1 => ?M, ?2 => ?N, ?3 => ?P, ?4 => ?Q,
50
+ ?5 => ?R, ?6 => ?S, ?7 => ?T, ?8 => ?U, ?9 => ?V,
51
+ 0 => ?L, 1 => ?M, 2 => ?N, 3 => ?P, 4 => ?Q,
52
+ 5 => ?R, 6 => ?S, 7 => ?T, 8 => ?U, 9 => ?V
53
+ }
54
+
55
+ DBDIR = File.realpath(File.join(File.dirname(__FILE__), 'db'))
56
+
57
+ attr_reader :name, :surname, :bday, :bplace, :gender
58
+
59
+ def name?
60
+ !!@name
61
+ end
62
+
63
+ def surname?
64
+ !!@surname
65
+ end
66
+
67
+ def bday?
68
+ !!@bday
69
+ end
70
+
71
+ def bplace?
72
+ !!@bplace
73
+ end
74
+
75
+ def gender?
76
+ !!@gender
77
+ end
78
+
79
+ def data?
80
+ self.name? and self.surname? and self.bday? and self.bplace? and self.gender?
81
+ end
82
+
83
+ def name=(n)
84
+ @name = n.upcase if n.is_a?(String) and n =~ /^[A-Z]+$/i
85
+
86
+ generate_code!
87
+ end
88
+
89
+ def surname=(s)
90
+ @surname = s.upcase if s.is_a?(String) and s =~ /^[A-Z]+$/i
91
+
92
+ generate_code!
93
+ end
94
+
95
+ def bday=(day)
96
+ @bday = case day
97
+ when Time
98
+ {
99
+ day: day.day,
100
+ mon: day.mon,
101
+ year: day.year.to_s[-2, 2].to_i
102
+ }
103
+ when String
104
+ self.bday = Time.new($4, $3, $1) if day =~ /^(\d{1,2})([^\dA-Z])(\d{1,2})\2(\d{2}||\d{4})$/i
105
+ @bday
106
+ else @bday
107
+ end
108
+
109
+ generate_code!
110
+ end
111
+
112
+ def bplace=(place)
113
+ return unless place.is_a?(String)
114
+ place.strip!
115
+ place.upcase!
116
+ if place =~ /^([A-Z']+\s*)+(?:\(([A-Z]{2})\))?$/
117
+ @bplace = {
118
+ city: $1.strip,
119
+ prov: $2
120
+ }
121
+ end
122
+
123
+ generate_code!
124
+ end
125
+
126
+ def gender=(gen)
127
+ if gen == :M or gen == :m or gen =~ /^m(ale)?$/i
128
+ @gender = :M
129
+ elsif gen == :F or gen == :f or gen =~ /^f(emale)?$/i
130
+ @gender = :F
131
+ end
132
+
133
+ generate_code!
134
+ end
135
+
136
+ def initialize(options = {})
137
+ self.name = options[:name]
138
+ self.surname = options[:surname]
139
+ self.bday = options[:bday]
140
+ self.bplace = options[:bplace]
141
+ self.gender = options[:gender]
142
+ end
143
+
144
+ def generate_code!
145
+ return unless self.data?
146
+ code = ""
147
+
148
+ # TRIPLET FOR SURNAME
149
+ code << (self.surname.scan(/[^AEIOU]/).join + self.surname.scan(/[AEIOU]/).join)[0, 3].ljust(3, 'X')
150
+
151
+ # TRIPLET FOR NAME
152
+ cons = self.name.scan(/[^AEIOU]/).join
153
+ cons << cons[1] && cons[1] = '' if cons.size > 3
154
+ code << (cons + self.name.scan(/[AEIOU]/).join)[0, 3].ljust(3, 'X')
155
+
156
+ # QUINTET FOR BDAY AND GENDER
157
+ code << self.bday[:year].to_s.rjust(2, '0')
158
+ code << CodiceFiscale::MONTH[self.bday[:mon]]
159
+ code << (self.bday[:day] + (self.gender == :F ? 40 : 0)).to_s.rjust(2, '0')
160
+
161
+ # QUARTET FOR BPLACE
162
+ code << self.belfiore_code(self.bplace[:city], self.bplace[:prov])
163
+
164
+ # CONTROL CODE
165
+ sum = 0
166
+ code.split(//).each_with_index {|ch, i|
167
+ sum += ALFANUM_TO_CODE[i.odd? ? :even : :odd][ch]
168
+ }
169
+ code << ((sum % 26) + 65).chr
170
+
171
+ self.replace(code)
172
+ end
173
+
174
+ def belfiore_code(city, province = nil)
175
+ code = nil
176
+ File.open(File.join(DBDIR, (province and province == 'EE' ? 'ee.db' : "#{city[0].downcase}.db"))) {|f|
177
+ f.each_line {|line|
178
+ co, c, p = line.strip.split(';')
179
+ code = co.dup and break if c == city and (province and province != 'EE' ? p == province : true)
180
+ }
181
+ }
182
+
183
+ code
184
+ end
185
+
186
+ def alternative(level = 1)
187
+ code = self.dup
188
+ code.scan(/[0-9]/).reverse[0, level].each {|n|
189
+ i = code.rindex(n)
190
+ code[i] = ALTERNATIVE[code[i]]
191
+ }
192
+
193
+ code
194
+ end
195
+
196
+ def alternative!(level = 1)
197
+ self.replace(self.alternative(level))
198
+ end
199
+ end
data/lib/db/a.db ADDED
@@ -0,0 +1,436 @@
1
+ A001;ABANO;TE
2
+ A004;ABBADIA;CE
3
+ A005;ABBADIA;LA
4
+ A006;ABBADIA;SA
5
+ A007;ABBASANTA;OR
6
+ A008;ABBATEGGIO;PE
7
+ A010;ABBIATEGRASSO;MI
8
+ A012;ABETONE;PT
9
+ A013;ABRIOLA;PZ
10
+ A014;ACATE;RG
11
+ A015;ACCADIA;FG
12
+ A016;ACCEGLIO;CN
13
+ A017;ACCETTURA;MT
14
+ A018;ACCIANO;AQ
15
+ A019;ACCUMOLI;RI
16
+ A020;ACERENZA;PZ
17
+ A023;ACERNO;SA
18
+ A024;ACERRA;NA
19
+ A025;ACI;BO
20
+ A026;ACI;CA
21
+ A027;ACI;CA
22
+ A029;ACI;SA
23
+ A028;ACIREALE;CT
24
+ A031;ACQUACANINA;MC
25
+ A032;ACQUAFONDATA;FR
26
+ A033;ACQUAFORMOSA;CS
27
+ A034;ACQUAFREDDA;BS
28
+ A035;ACQUALAGNA;PU
29
+ A039;ACQUANEGRA;CR
30
+ A038;ACQUANEGRA;SU
31
+ A040;ACQUAPENDENTE;VT
32
+ A041;ACQUAPPESA;CS
33
+ A042;ACQUARICA;DE
34
+ A043;ACQUARO;VV
35
+ A044;ACQUASANTA;TE
36
+ A045;ACQUASPARTA;TR
37
+ A050;ACQUAVIVA;CO
38
+ A048;ACQUAVIVA;DE
39
+ A051;ACQUAVIVA D'ISERNIA;IS
40
+ A047;ACQUAVIVA;PI
41
+ A049;ACQUAVIVA;PL
42
+ M211;ACQUEDOLCI;ME
43
+ A052;ACQUI;TE
44
+ A053;ACRI;CS
45
+ A054;ACUTO;FR
46
+ A055;ADELFIA;BA
47
+ A056;ADRANO;CT
48
+ A057;ADRARA;SA
49
+ A058;ADRARA;SA
50
+ A059;ADRIA;RO
51
+ A060;ADRO;BS
52
+ A061;AFFI;VR
53
+ A062;AFFILE;RM
54
+ A064;AFRAGOLA;NA
55
+ A065;AFRICO;RC
56
+ A067;AGAZZANO;PC
57
+ A068;AGEROLA;NA
58
+ A069;AGGIUS;SS
59
+ A070;AGIRA;EN
60
+ A071;AGLIANA;PT
61
+ A072;AGLIANO;TE
62
+ A074;AGLIE';TO
63
+ H848;AGLIENTU;SS
64
+ A075;AGNA;PD
65
+ A076;AGNADELLO;CR
66
+ A077;AGNANA;CA
67
+ A080;AGNONE;IS
68
+ A082;AGNOSINE;BS
69
+ A083;AGORDO;BL
70
+ A084;AGOSTA;RM
71
+ A085;AGRA;VA
72
+ A087;AGRATE;BR
73
+ A088;AGRATE;CO
74
+ A089;AGRIGENTO;AG
75
+ A091;AGROPOLI;SA
76
+ A092;AGUGLIANO;AN
77
+ A093;AGUGLIARO;VI
78
+ A096;AICURZIO;MI
79
+ A097;AIDOMAGGIORE;OR
80
+ A098;AIDONE;EN
81
+ A100;AIELLI;AQ
82
+ A102;AIELLO;CA
83
+ A103;AIELLO;DE
84
+ A101;AIELLO;DE
85
+ A105;AIETA;CS
86
+ A106;AILANO;CE
87
+ A107;AILOCHE;BI
88
+ A109;AIRASCA;TO
89
+ A110;AIROLA;BN
90
+ A111;AIROLE;IM
91
+ A112;AIRUNO;LC
92
+ A113;AISONE;CN
93
+ A116;ALA;TN
94
+ A115;ALA';DE
95
+ A117;ALA;DI
96
+ A118;ALAGNA;PV
97
+ A119;ALAGNA;VA
98
+ A120;ALANNO;PE
99
+ A121;ALANO;DI
100
+ A122;ALASSIO;SV
101
+ A123;ALATRI;FR
102
+ A124;ALBA;CN
103
+ A125;ALBA;AD
104
+ A126;ALBAGIARA;OR
105
+ A127;ALBAIRATE;MI
106
+ A128;ALBANELLA;SA
107
+ A131;ALBANO;DI
108
+ A132;ALBANO;LA
109
+ A129;ALBANO;SA
110
+ A130;ALBANO;VE
111
+ A134;ALBAREDO;AR
112
+ A137;ALBAREDO D'ADIGE;VR
113
+ A135;ALBAREDO;PE
114
+ A138;ALBARETO;PR
115
+ A139;ALBARETTO;DE
116
+ A143;ALBAVILLA;CO
117
+ A145;ALBENGA;SV
118
+ A146;ALBERA;LI
119
+ A149;ALBEROBELLO;BA
120
+ A150;ALBERONA;FG
121
+ A153;ALBESE;CO
122
+ A154;ALBETTONE;VI
123
+ A155;ALBI;CZ
124
+ A158;ALBIANO;TN
125
+ A157;ALBIANO D'IVREA;TO
126
+ A159;ALBIATE;MI
127
+ A160;ALBIDONA;CS
128
+ A161;ALBIGNASEGO;PD
129
+ A162;ALBINEA;RE
130
+ A163;ALBINO;BG
131
+ A164;ALBIOLO;CO
132
+ A166;ALBISOLA;SU
133
+ A165;ALBISSOLA;MA
134
+ A167;ALBIZZATE;VA
135
+ A171;ALBONESE;PV
136
+ A172;ALBOSAGGIA;SO
137
+ A173;ALBUGNANO;AT
138
+ A175;ALBUZZANO;PV
139
+ A176;ALCAMO;TP
140
+ A177;ALCARA;LI
141
+ A178;ALDENO;TN
142
+ A179;ALDINO .ALDEIN.;BZ
143
+ A180;ALES;OR
144
+ A182;ALESSANDRIA;AL
145
+ A183;ALESSANDRIA;DE
146
+ A181;ALESSANDRIA;DE
147
+ A184;ALESSANO;LE
148
+ A185;ALEZIO;LE
149
+ A186;ALFANO;SA
150
+ A187;ALFEDENA;AQ
151
+ A188;ALFIANELLO;BS
152
+ A189;ALFIANO;NA
153
+ A191;ALFONSINE;RA
154
+ A192;ALGHERO;SS
155
+ A193;ALGUA;BG
156
+ A194;ALI';ME
157
+ A201;ALI';TE
158
+ A195;ALIA;PA
159
+ A196;ALIANO;MT
160
+ A197;ALICE;BE
161
+ A198;ALICE;CA
162
+ A199;ALICE;SU
163
+ A200;ALIFE;CE
164
+ A202;ALIMENA;PA
165
+ A203;ALIMINUSA;PA
166
+ A204;ALLAI;OR
167
+ A206;ALLEGHE;BL
168
+ A205;ALLEIN;AO
169
+ A207;ALLERONA;TR
170
+ A208;ALLISTE;LE
171
+ A210;ALLUMIERE;RM
172
+ A211;ALLUVIONI;CA
173
+ A214;ALME';BG
174
+ A216;ALMENNO;SA
175
+ A217;ALMENNO;SA
176
+ A218;ALMESE;TO
177
+ A220;ALONTE;VI
178
+ A221;ALPETTE;TO
179
+ A222;ALPIGNANO;TO
180
+ A223;ALSENO;PC
181
+ A224;ALSERIO;CO
182
+ A225;ALTAMURA;BA
183
+ A226;ALTARE;SV
184
+ A228;ALTAVILLA;IR
185
+ A229;ALTAVILLA;MI
186
+ A227;ALTAVILLA;MO
187
+ A230;ALTAVILLA;SI
188
+ A231;ALTAVILLA;VI
189
+ A233;ALTIDONA;AP
190
+ A234;ALTILIA;CS
191
+ A235;ALTINO;CH
192
+ A236;ALTISSIMO;VI
193
+ A237;ALTIVOLE;TV
194
+ A238;ALTO;CN
195
+ A239;ALTOFONTE;PA
196
+ A240;ALTOMONTE;CS
197
+ A241;ALTOPASCIO;LU
198
+ A242;ALVIANO;TR
199
+ A243;ALVIGNANO;CE
200
+ A244;ALVITO;FR
201
+ A246;ALZANO;LO
202
+ A245;ALZANO;SC
203
+ A249;ALZATE;BR
204
+ A251;AMALFI;SA
205
+ A252;AMANDOLA;AP
206
+ A253;AMANTEA;CS
207
+ A254;AMARO;UD
208
+ A255;AMARONI;CZ
209
+ A256;AMASENO;FR
210
+ A257;AMATO;CZ
211
+ A258;AMATRICE;RI
212
+ A259;AMBIVERE;BG
213
+ A260;AMBLAR;TN
214
+ A261;AMEGLIA;SP
215
+ A262;AMELIA;TR
216
+ A263;AMENDOLARA;CS
217
+ A264;AMENO;NO
218
+ A265;AMOROSI;BN
219
+ A267;AMPEZZO;UD
220
+ A268;ANACAPRI;NA
221
+ A269;ANAGNI;FR
222
+ A270;ANCARANO;TE
223
+ A271;ANCONA;AN
224
+ A272;ANDALI;CZ
225
+ A274;ANDALO;TN
226
+ A273;ANDALO;VA
227
+ A275;ANDEZENO;TO
228
+ A278;ANDORA;SV
229
+ A280;ANDORNO;MI
230
+ A281;ANDRANO;LE
231
+ A282;ANDRATE;TO
232
+ A283;ANDREIS;PN
233
+ A284;ANDRETTA;AV
234
+ A285;ANDRIA;BA
235
+ A286;ANDRIANO .ANDRIAN.;BZ
236
+ A287;ANELA;SS
237
+ A288;ANFO;BS
238
+ A290;ANGERA;VA
239
+ A291;ANGHIARI;AR
240
+ A292;ANGIARI;VR
241
+ A293;ANGOLO;TE
242
+ A294;ANGRI;SA
243
+ A295;ANGROGNA;TO
244
+ A297;ANGUILLARA;SA
245
+ A296;ANGUILLARA;VE
246
+ A299;ANNICCO;CR
247
+ A301;ANNONE;DI
248
+ A302;ANNONE;VE
249
+ A303;ANOIA;RC
250
+ A304;ANTEGNATE;BG
251
+ A306;ANTERIVO .ALTREI.;BZ
252
+ A305;ANTEY-SAINT-ANDRE';AO
253
+ A309;ANTICOLI;CO
254
+ A312;ANTIGNANO;AT
255
+ A313;ANTILLO;ME
256
+ A314;ANTONIMINA;RC
257
+ A315;ANTRODOCO;RI
258
+ A317;ANTRONA;SC
259
+ A318;ANVERSA;DE
260
+ A319;ANZANO;DE
261
+ A320;ANZANO;DI
262
+ A321;ANZI;PZ
263
+ A323;ANZIO;RM
264
+ A324;ANZOLA;DE
265
+ A325;ANZOLA D'OSSOLA;VB
266
+ A326;AOSTA;AO
267
+ A327;APECCHIO;PU
268
+ A328;APICE;BN
269
+ A329;APIRO;MC
270
+ A330;APOLLOSA;BN
271
+ A333;APPIANO;GE
272
+ A332;APPIANO;SU
273
+ A334;APPIGNANO;MC
274
+ A335;APPIGNANO;DE
275
+ A337;APRICA;SO
276
+ A338;APRICALE;IM
277
+ A339;APRICENA;FG
278
+ A340;APRIGLIANO;CS
279
+ A341;APRILIA;LT
280
+ A343;AQUARA;SA
281
+ A344;AQUILA D'ARROSCIA;IM
282
+ A346;AQUILEIA;UD
283
+ A347;AQUILONIA;AV
284
+ A348;AQUINO;FR
285
+ A350;ARADEO;LE
286
+ A351;ARAGONA;AG
287
+ A352;ARAMENGO;AT
288
+ A354;ARBA;PN
289
+ A357;ARBOREA;OR
290
+ A358;ARBORIO;VC
291
+ A359;ARBUS;CA
292
+ A360;ARCADE;TV
293
+ A363;ARCE;FR
294
+ A365;ARCENE;BG
295
+ A366;ARCEVIA;AN
296
+ A367;ARCHI;CH
297
+ A369;ARCIDOSSO;GR
298
+ A370;ARCINAZZO;RO
299
+ A371;ARCISATE;VA
300
+ A372;ARCO;TN
301
+ A373;ARCOLA;SP
302
+ A374;ARCOLE;VR
303
+ A375;ARCONATE;MI
304
+ A376;ARCORE;MI
305
+ A377;ARCUGNANO;VI
306
+ A379;ARDARA;SS
307
+ A380;ARDAULI;OR
308
+ M213;ARDEA;RM
309
+ A382;ARDENNO;SO
310
+ A383;ARDESIO;BG
311
+ A385;ARDORE;RC
312
+ A386;ARENA;VV
313
+ A387;ARENA;PO
314
+ A388;ARENZANO;GE
315
+ A389;ARESE;MI
316
+ A390;AREZZO;AR
317
+ A391;ARGEGNO;CO
318
+ A392;ARGELATO;BO
319
+ A393;ARGENTA;FE
320
+ A394;ARGENTERA;CN
321
+ A396;ARGUELLO;CN
322
+ A397;ARGUSTO;CZ
323
+ A398;ARI;CH
324
+ A399;ARIANO;IR
325
+ A400;ARIANO;NE
326
+ A401;ARICCIA;RM
327
+ A402;ARIELLI;CH
328
+ A403;ARIENZO;CE
329
+ A405;ARIGNANO;TO
330
+ A407;ARITZO;NU
331
+ A409;ARIZZANO;VB
332
+ A412;ARLENA;DI
333
+ A413;ARLUNO;MI
334
+ A414;ARMENO;NO
335
+ A415;ARMENTO;PZ
336
+ A418;ARMO;IM
337
+ A419;ARMUNGIA;CA
338
+ A424;ARNAD;AO
339
+ A421;ARNARA;FR
340
+ A422;ARNASCO;SV
341
+ A425;ARNESANO;LE
342
+ A427;AROLA;VB
343
+ A429;ARONA;NO
344
+ A430;AROSIO;CO
345
+ A431;ARPAIA;BN
346
+ A432;ARPAISE;BN
347
+ A433;ARPINO;FR
348
+ A434;ARQUA';PE
349
+ A435;ARQUA';PO
350
+ A437;ARQUATA;DE
351
+ A436;ARQUATA;SC
352
+ A438;ARRE;PD
353
+ A439;ARRONE;TR
354
+ A441;ARSAGO;SE
355
+ A443;ARSIE';BL
356
+ A444;ARSIERO;VI
357
+ A445;ARSITA;TE
358
+ A446;ARSOLI;RM
359
+ A447;ARTA;TE
360
+ A448;ARTEGNA;UD
361
+ A449;ARTENA;RM
362
+ A451;ARTOGNE;BS
363
+ A452;ARVIER;AO
364
+ A453;ARZACHENA;SS
365
+ A440;ARZAGO D'ADDA;BG
366
+ A454;ARZANA;NU
367
+ A455;ARZANO;NA
368
+ A456;ARZENE;PN
369
+ A458;ARZERGRANDE;PD
370
+ A459;ARZIGNANO;VI
371
+ A460;ASCEA;SA
372
+ A461;ASCIANO;SI
373
+ A462;ASCOLI;PI
374
+ A463;ASCOLI;SA
375
+ A464;ASCREA;RI
376
+ A465;ASIAGO;VI
377
+ A467;ASIGLIANO;VE
378
+ A466;ASIGLIANO;VE
379
+ A470;ASOLA;MN
380
+ A471;ASOLO;TV
381
+ A473;ASSAGO;MI
382
+ A474;ASSEMINI;CA
383
+ A475;ASSISI;PG
384
+ A476;ASSO;CO
385
+ A477;ASSOLO;OR
386
+ A478;ASSORO;EN
387
+ A479;ASTI;AT
388
+ A480;ASUNI;OR
389
+ A481;ATELETA;AQ
390
+ A482;ATELLA;PZ
391
+ A484;ATENA;LU
392
+ A485;ATESSA;CH
393
+ A486;ATINA;FR
394
+ A487;ATRANI;SA
395
+ A488;ATRI;TE
396
+ A489;ATRIPALDA;AV
397
+ A490;ATTIGLIANO;TR
398
+ A491;ATTIMIS;UD
399
+ A492;ATZARA;NU
400
+ A493;AUDITORE;PU
401
+ A494;AUGUSTA;SR
402
+ A495;AULETTA;SA
403
+ A496;AULLA;MS
404
+ A497;AURANO;VB
405
+ A499;AURIGO;IM
406
+ A501;AURONZO;DI
407
+ A502;AUSONIA;FR
408
+ A503;AUSTIS;NU
409
+ A506;AVEGNO;GE
410
+ A507;AVELENGO .HAFLING.;BZ
411
+ A508;AVELLA;AV
412
+ A509;AVELLINO;AV
413
+ A511;AVERARA;BG
414
+ A512;AVERSA;CE
415
+ A514;AVETRANA;TA
416
+ A515;AVEZZANO;AQ
417
+ A516;AVIANO;PN
418
+ A517;AVIATICO;BG
419
+ A518;AVIGLIANA;TO
420
+ A519;AVIGLIANO;PZ
421
+ M258;AVIGLIANO;UM
422
+ A520;AVIO;TN
423
+ A521;AVISE;AO
424
+ A522;AVOLA;SR
425
+ A523;AVOLASCA;AL
426
+ A094;AYAS;AO
427
+ A108;AYMAVILLES;AO
428
+ A525;AZEGLIO;TO
429
+ A526;AZZANELLO;CR
430
+ A527;AZZANO D'ASTI;AT
431
+ A530;AZZANO;DE
432
+ A529;AZZANO;ME
433
+ A528;AZZANO;SA
434
+ A531;AZZATE;VA
435
+ A532;AZZIO;VA
436
+ A533;AZZONE;BG